use http::{HeaderMap, HeaderValue};
use secrecy::{ExposeSecret, SecretString};
use crate::error::Error;
#[derive(Clone, Debug, Default)]
#[non_exhaustive]
pub enum Auth {
#[default]
None,
Session { token: SecretString },
ApiKey { key: SecretString },
}
impl Auth {
pub fn none() -> Self {
Self::None
}
pub fn session(token: impl Into<String>) -> Self {
Self::Session {
token: SecretString::from(token.into()),
}
}
pub fn api_key(key: impl Into<String>) -> Self {
Self::ApiKey {
key: SecretString::from(key.into()),
}
}
pub(crate) fn apply(&self, headers: &mut HeaderMap) -> Result<(), Error> {
match self {
Auth::None => Ok(()),
Auth::Session { token } => {
let value = HeaderValue::from_str(token.expose_secret())
.map_err(|source| Error::invalid_header_value("X-Metabase-Session", source))?;
headers.insert("X-Metabase-Session", value);
Ok(())
}
Auth::ApiKey { key } => {
let value = HeaderValue::from_str(key.expose_secret())
.map_err(|source| Error::invalid_header_value("X-API-KEY", source))?;
headers.insert("X-API-KEY", value);
Ok(())
}
}
}
}