use crate::client::{Client, Error, SignedIn, SignedOut};
use serde::{Deserialize, Serialize};
use serde_json::Value;
pub enum SignInOutcome {
Authenticated(Client<SignedIn>),
Email(EmailCallback),
TOTP(TOTPCallback),
}
pub type EmailCallback = fn(&mut Client<SignedOut>) -> Result<Client<SignedIn>, Error>;
pub type TOTPCallback = fn(&mut Client<SignedOut>, String) -> Result<Client<SignedIn>, Error>;
#[derive(Clone, Debug, Deserialize, Serialize)]
#[serde(rename_all = "PascalCase")]
pub(crate) struct SigninParameters {
pub email: String,
pub password: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub auth: Option<AuthParameters>,
}
#[derive(Clone, Debug, Deserialize, Serialize)]
pub(crate) struct AuthParameters {
#[serde(rename = "Email", skip_serializing_if = "Option::is_none")]
pub email: Option<String>,
#[serde(rename = "TOTP", skip_serializing_if = "Option::is_none")]
pub totp: Option<String>,
}
#[derive(Clone, Debug, Deserialize, Serialize)]
#[serde(rename_all = "PascalCase")]
pub(crate) struct AuthReply {
pub auth_data: Option<AuthData>,
pub default_auth_type: Option<Auth2FAMethod>,
#[serde(alias = "Needs2FA")]
pub needs_2fa: bool,
}
#[derive(Clone, Debug, Deserialize, Serialize)]
pub(crate) struct AuthData {
#[serde(rename = "Email")]
pub email: Option<AuthDataEmail>,
#[serde(rename = "TOTP")]
pub totp: Option<Value>,
}
#[derive(Clone, Debug, Deserialize, Serialize)]
#[serde(rename_all = "PascalCase")]
pub(crate) struct AuthDataEmail {
pub id: Option<String>,
pub email: Option<String>,
}
#[derive(Copy, Clone, Debug, Deserialize, Serialize)]
pub(crate) enum Auth2FAMethod {
#[serde(rename = "Email")]
Email,
#[serde(rename = "TOTP")]
TOTP,
}
#[derive(Debug)]
pub(crate) struct SavedAuthDetails {
pub email: String,
pub email_id: Option<String>,
pub password: String,
}