lib_client_github/
auth.rs

1use async_trait::async_trait;
2use reqwest::header::{HeaderMap, HeaderValue, AUTHORIZATION};
3
4use crate::error::Result;
5
6#[async_trait]
7pub trait AuthStrategy: Send + Sync {
8    async fn apply(&self, headers: &mut HeaderMap) -> Result<()>;
9}
10
11pub struct NoAuth;
12
13#[async_trait]
14impl AuthStrategy for NoAuth {
15    async fn apply(&self, _headers: &mut HeaderMap) -> Result<()> {
16        Ok(())
17    }
18}
19
20pub fn no_auth() -> NoAuth {
21    NoAuth
22}
23
24pub struct TokenAuth {
25    token: String,
26}
27
28impl TokenAuth {
29    pub fn new(token: impl Into<String>) -> Self {
30        Self {
31            token: token.into(),
32        }
33    }
34}
35
36#[async_trait]
37impl AuthStrategy for TokenAuth {
38    async fn apply(&self, headers: &mut HeaderMap) -> Result<()> {
39        let value = format!("Bearer {}", self.token);
40        headers.insert(
41            AUTHORIZATION,
42            HeaderValue::from_str(&value).expect("valid header value"),
43        );
44        Ok(())
45    }
46}
47
48pub struct BasicAuth {
49    username: String,
50    password: String,
51}
52
53impl BasicAuth {
54    pub fn new(username: impl Into<String>, password: impl Into<String>) -> Self {
55        Self {
56            username: username.into(),
57            password: password.into(),
58        }
59    }
60}
61
62#[async_trait]
63impl AuthStrategy for BasicAuth {
64    async fn apply(&self, headers: &mut HeaderMap) -> Result<()> {
65        use base64::{engine::general_purpose::STANDARD, Engine};
66        let credentials = format!("{}:{}", self.username, self.password);
67        let encoded = STANDARD.encode(credentials.as_bytes());
68        let value = format!("Basic {}", encoded);
69        headers.insert(
70            AUTHORIZATION,
71            HeaderValue::from_str(&value).expect("valid header value"),
72        );
73        Ok(())
74    }
75}
76
77pub fn token(token: impl Into<String>) -> TokenAuth {
78    TokenAuth::new(token)
79}
80
81pub fn basic(username: impl Into<String>, password: impl Into<String>) -> BasicAuth {
82    BasicAuth::new(username, password)
83}