Advertisement
Wuelfhis

Rust Question

Jan 23rd, 2024 (edited)
107
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Rust 3.58 KB | None | 0 0
  1. use std::env;
  2. use reqwest::header::{ HeaderMap, HeaderValue };
  3. use reqwest;
  4.  
  5. const GITLAB_URL: &str = "https://git.svc.shore.to/api/v4";
  6. pub enum TokenListType {
  7.     Group,
  8.     Project,
  9.     // Token,
  10. }
  11. pub struct TokenList {
  12.     pub _type: TokenListType,
  13.     pub id: Option<i64>,
  14.     data: Option<serde_json::Value>,
  15. }
  16.  
  17. #[derive(Debug)]
  18. pub struct ErrorResponse {
  19.     pub message: String,
  20. }
  21.  
  22. impl TokenList {
  23.     pub fn new(_type: TokenListType, _id: Option<i64>) -> Self {
  24.         TokenList { _type: _type, id: _id, data: None }
  25.     }
  26.     pub fn run(&mut self) -> Result<&mut TokenList, ErrorResponse> {
  27.         let gitlab_token: String = env::var("gitlab_token").expect("GITLAB_TOKEN must be set");
  28.  
  29.         let mut headers = HeaderMap::new();
  30.         headers.insert("PRIVATE-TOKEN", HeaderValue::from_str(&gitlab_token).unwrap());
  31.  
  32.         let client = reqwest::blocking::Client::new();
  33.  
  34.         let mut endpoint: String = match self._type {
  35.             TokenListType::Group => "groups".to_owned(),
  36.             TokenListType::Project => "projects".to_owned(),
  37.             // TokenListType::Token => "tokens".to_owned(),
  38.         };
  39.  
  40.         if self.id.is_some() {
  41.             endpoint = format!("{}/{}/access_tokens", endpoint, self.id.unwrap());
  42.         }
  43.  
  44.         let final_url = format!("{GITLAB_URL}/{endpoint}");
  45.         // println!("######### Endpoint {}", final_url);
  46.         let response = client
  47.             .get(final_url)
  48.             .headers(headers)
  49.             .send()
  50.             .map_err(|e|
  51.                 Err::<String, ErrorResponse>(ErrorResponse {
  52.                     message: format!("Response Error: {}", e),
  53.                 })
  54.             );
  55.  
  56.         let value = response
  57.             .unwrap()
  58.             .json::<serde_json::Value>()
  59.             .map_err(|e| ErrorResponse { message: format!("Error Parsing Json") });
  60.  
  61.         match value {
  62.             Ok(val) => {
  63.                 self.data = Some(val);
  64.                 Ok(self)
  65.             }
  66.             Err(e) =>
  67.                 Err(ErrorResponse {
  68.                     message: format!("Error getting values from json {:?}", e),
  69.                 }),
  70.         }
  71.     }
  72.     pub fn print(&self) -> () {
  73.         println!("Project Name, Project ID, Token Name, Expire Date\n");
  74.         if let Some(projects) = self.data.as_ref().and_then(|val| val.as_array()) {
  75.             projects.iter().for_each(|value| {
  76.                 // println!("{:?},{:?} ", value["name"], value["id"].as_i64());
  77.                 let pro_name = value["name"].as_str();
  78.                 let pro_id = value["id"].as_i64();
  79.                 let mut token_request = TokenList::new(
  80.                     TokenListType::Project,
  81.                     value["id"].as_i64()
  82.                 );
  83.                 let _ = token_request.run();
  84.                 if let Some(tokens) = token_request.data.as_ref().and_then(|val| val.as_array()) {
  85.                     tokens.iter().for_each(|val| {
  86.                         println!(
  87.                             "{:?}, {:?}, {:?}, {:?}",
  88.                             pro_name,
  89.                             pro_id,
  90.                             val["name"].as_str(),
  91.                             val["id"].as_i64()
  92.                         );
  93.                     });
  94.                 }
  95.             })
  96.         };
  97.     }
  98. }
  99.  
  100. // main.src
  101. //
  102. // use lib::{ TokenList, TokenListType };
  103.  
  104. // fn main() {
  105. //     // println!("Hello, world!");
  106. //     let mut group_list = TokenList::new(TokenListType::Project, None);
  107. //     let result = group_list.run();
  108. //     result.expect("Cannot Print").print()
  109. // }
  110.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement