use http::{HeaderMap, HeaderValue};
use std::fmt::Debug;
use thiserror::Error;
use crate::api;
#[derive(Debug, Error)]
#[non_exhaustive]
pub enum AuthError {
#[error("header value error: {}", source)]
HeaderValue {
#[from]
source: http::header::InvalidHeaderValue,
},
}
pub trait Scope {
fn set_header<'a>(&self, headers: &'a mut HeaderMap) -> Result<&'a mut HeaderMap, AuthError>;
}
pub struct Authenticated(api::AccessToken);
pub struct Unauthenticated;
impl Scope for Authenticated {
fn set_header<'a>(&self, headers: &'a mut HeaderMap) -> Result<&'a mut HeaderMap, AuthError> {
let value = format!("Bearer {}", self.0);
let mut token_header_value = HeaderValue::from_str(&value)?;
token_header_value.set_sensitive(true);
headers.insert(http::header::AUTHORIZATION, token_header_value);
Ok(headers)
}
}
impl Scope for Unauthenticated {
fn set_header<'a>(&self, headers: &'a mut HeaderMap) -> Result<&'a mut HeaderMap, AuthError> {
Ok(headers)
}
}
impl From<Authenticated> for Unauthenticated {
fn from(_: Authenticated) -> Self {
Unauthenticated
}
}
impl From<api::auth::AccessToken> for Authenticated {
fn from(f: api::auth::AccessToken) -> Self {
Self(f.access_token)
}
}
impl From<api::AccessToken> for Authenticated {
fn from(f: api::AccessToken) -> Self {
Self(f)
}
}