lib_client_github/
auth.rs1use 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}