synd_client/client/
authentication.rs1use 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}