use color_eyre::owo_colors::OwoColorize; use reqwest::{ header::{HeaderMap, HeaderValue}, Client, Url, }; use reqwest_middleware::{ClientBuilder, ClientWithMiddleware}; use reqwest_retry::{policies::ExponentialBackoff, RetryTransientMiddleware}; use reqwest_tracing::TracingMiddleware; use serde::Deserialize; use tracing::trace; pub struct GitLab { url: Url, client: ClientWithMiddleware, } // --- /* "avatar_url": "http://localhost:3000/uploads/user/avatar/1/index.jpg", // "web_url": "http://localhost:3000/john_smith", // "created_at": "2012-05-23T08:00:58Z", // "bio": "", // "location": null, // "skype": "", // "linkedin": "", // "twitter": "", // "discord": "", // "website_url": "", // "organization": "", // "job_title": "", // "pronouns": "he/him", // "bot": false, // "work_information": null, // "followers": 0, // "following": 0, // "local_time": "3:38 PM", // "last_sign_in_at": "2012-06-01T11:41:01Z", // "confirmed_at": "2012-05-23T09:05:22Z", // "theme_id": 1, // "last_activity_on": "2012-05-23", // "color_scheme_id": 2, // "projects_limit": 100, // "current_sign_in_at": "2012-06-02T06:36:55Z", // "identities": [ // {"provider": "github", "extern_uid": "2435223452345"}, // {"provider": "bitbucket", "extern_uid": "john_smith"}, // {"provider": "google_oauth2", "extern_uid": "8776128412476123468721346"} // ], // "can_create_group": true, // "can_create_project": true, // "two_factor_enabled": true, // "external": false, // "private_profile": false, // "commit_email": "admin@example.com", // } */ #[derive(Deserialize, Debug)] pub struct User { pub id: u64, pub username: String, pub email: String, pub name: String, pub state: String, pub locked: bool, pub created_at: String, pub public_email: String, } impl GitLab { pub fn try_new(url: &str, token: &str) -> Result { let url = Url::parse(url)?; let mut headers = HeaderMap::new(); headers.insert("PRIVATE-TOKEN", HeaderValue::from_str(token)?); let proxy = reqwest::Proxy::all("socks5h://localhost:9982")?; let retry_policy = ExponentialBackoff::builder().build_with_max_retries(3); let base_client = Client::builder() .default_headers(headers) .proxy(proxy) .build()?; let client = ClientBuilder::new(base_client) .with(TracingMiddleware::default()) .with(RetryTransientMiddleware::new_with_policy(retry_policy)) .build(); Ok(Self { url, client }) } pub fn url(&self, path: &str) -> Result { Ok(self.url.join(path)?) } pub async fn me(&self) -> Result { let res = self.client.get(self.url("/user")?).send().await?; trace!("{res:?}"); let body = res.text().await?; trace!("{body:?}"); Ok(serde_json::from_str::(&body)?) // Ok(res.json::().await?) } }