synd-client 0.4.0

syndicationd API client
Documentation
use reqwest::header::{self, HeaderMap, HeaderValue};

use crate::SyndApiError;

pub enum ApiCredential {
    Github { access_token: String },
    Google { id_token: String },
    LocalBearer { token: String },
}

impl TryFrom<ApiCredential> for HeaderValue {
    type Error = header::InvalidHeaderValue;

    fn try_from(credential: ApiCredential) -> Result<Self, Self::Error> {
        let value = match credential {
            ApiCredential::Github { access_token } => format!("github {access_token}"),
            ApiCredential::Google { id_token } => format!("google {id_token}"),
            ApiCredential::LocalBearer { token } => format!("Bearer {token}"),
        };
        let mut value = HeaderValue::try_from(value)?;
        value.set_sensitive(true);
        Ok(value)
    }
}

#[derive(Clone)]
pub(super) enum ClientAuthentication {
    Required,
    Header(HeaderValue),
    TransportTrusted,
}

impl ClientAuthentication {
    pub(super) fn configure(&mut self, credential: ApiCredential) -> Result<(), SyndApiError> {
        *self = Self::Header(credential.try_into()?);
        Ok(())
    }

    pub(super) fn apply_authorization_header(
        &self,
        headers: &mut HeaderMap,
    ) -> Result<(), SyndApiError> {
        match self {
            Self::Required => Err(SyndApiError::MissingCredential),
            Self::Header(value) => {
                headers.insert(header::AUTHORIZATION, value.clone());
                Ok(())
            }
            Self::TransportTrusted => Ok(()),
        }
    }
}