use super::bakalari::Client;
use reqwest::Response;
use std::borrow::Cow;
use std::sync::Arc;
use thiserror::Error;
pub use credentials::Credentials;
mod credentials;
#[derive(Debug, Error)]
pub enum LoginError {
#[error("{0}")]
Request(#[from] reqwest::Error),
#[error("login failed")]
Login(Response),
#[error("failed to parse cookie")]
CookieParse,
}
pub type LoginResult<T> = Result<T, LoginError>;
#[derive(Debug, Clone)]
pub enum Auth {
Credentials(Credentials),
Token(String),
None,
}
impl Auth {
pub async fn get_token(&self, client: Arc<Client>) -> LoginResult<Cow<'_, String>> {
match self {
Self::Token(token) => Ok(Cow::Borrowed(token)),
Self::Credentials(creds) => Ok(Cow::Owned(creds.get_token(client.clone()).await?)),
Self::None => Ok(Cow::Owned(String::new())),
}
}
pub async fn from_creds(creds: (String, String), client: &Client) -> LoginResult<Self> {
Ok(Self::Credentials(Credentials::new(creds, client).await?))
}
#[must_use]
pub const fn from_token(token: String) -> Self {
Self::Token(token)
}
}