Skip to main content

synd_client/client/
authentication.rs

1use reqwest::header::{self, HeaderMap, HeaderValue};
2
3use crate::SyndApiError;
4
5pub enum ApiCredential {
6    Github { access_token: String },
7    Google { id_token: String },
8    LocalBearer { token: String },
9}
10
11impl TryFrom<ApiCredential> for HeaderValue {
12    type Error = header::InvalidHeaderValue;
13
14    fn try_from(credential: ApiCredential) -> Result<Self, Self::Error> {
15        let value = match credential {
16            ApiCredential::Github { access_token } => format!("github {access_token}"),
17            ApiCredential::Google { id_token } => format!("google {id_token}"),
18            ApiCredential::LocalBearer { token } => format!("Bearer {token}"),
19        };
20        let mut value = HeaderValue::try_from(value)?;
21        value.set_sensitive(true);
22        Ok(value)
23    }
24}
25
26#[derive(Clone)]
27pub(super) enum ClientAuthentication {
28    Required,
29    Header(HeaderValue),
30    TransportTrusted,
31}
32
33impl ClientAuthentication {
34    pub(super) fn configure(&mut self, credential: ApiCredential) -> Result<(), SyndApiError> {
35        *self = Self::Header(credential.try_into()?);
36        Ok(())
37    }
38
39    pub(super) fn apply_authorization_header(
40        &self,
41        headers: &mut HeaderMap,
42    ) -> Result<(), SyndApiError> {
43        match self {
44            Self::Required => Err(SyndApiError::MissingCredential),
45            Self::Header(value) => {
46                headers.insert(header::AUTHORIZATION, value.clone());
47                Ok(())
48            }
49            Self::TransportTrusted => Ok(()),
50        }
51    }
52}