use alloc::string::String;
use alloc::vec::Vec;
use crate::{
AuthConfig, CloudflareConfig, CreatedUser, Link, LoginRequest, NewUser, PasswordChange,
RegisterInfo, RegisterRequest, UserChange, UserEntry, UserId, UserInfo,
};
#[derive(Debug, Clone, PartialEq, Eq)]
#[non_exhaustive]
pub enum AuthRequest {
Config,
Me,
Login(LoginRequest),
CloudflareSignIn,
Logout,
RegisterInfo {
token: String,
},
Register {
token: String,
request: RegisterRequest,
},
ChangePassword(PasswordChange),
UpdateAccount(UserChange),
Users,
CreateUser(NewUser),
UpdateUser {
id: UserId,
change: UserChange,
},
DeleteUser {
id: UserId,
},
IssueLink {
id: UserId,
},
RevokeLink {
id: UserId,
},
SignOutUser {
id: UserId,
},
RevokeAccess {
id: UserId,
},
Impersonate {
id: UserId,
},
StopImpersonating,
Cloudflare,
SetCloudflare(CloudflareConfig),
}
impl AuthRequest {
pub fn cookie(&self) -> Option<CookieChange> {
match self {
AuthRequest::Login(..)
| AuthRequest::CloudflareSignIn
| AuthRequest::Register { .. } => Some(CookieChange::Set),
AuthRequest::Impersonate { .. } | AuthRequest::StopImpersonating => {
Some(CookieChange::Replace)
}
AuthRequest::Logout => Some(CookieChange::Clear),
AuthRequest::Config
| AuthRequest::Me
| AuthRequest::RegisterInfo { .. }
| AuthRequest::ChangePassword(..)
| AuthRequest::UpdateAccount(..)
| AuthRequest::Users
| AuthRequest::CreateUser(..)
| AuthRequest::UpdateUser { .. }
| AuthRequest::DeleteUser { .. }
| AuthRequest::IssueLink { .. }
| AuthRequest::RevokeLink { .. }
| AuthRequest::SignOutUser { .. }
| AuthRequest::RevokeAccess { .. }
| AuthRequest::Cloudflare
| AuthRequest::SetCloudflare(..) => None,
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum CookieChange {
Set,
Replace,
Clear,
}
#[derive(Debug, Clone, PartialEq, Eq)]
#[non_exhaustive]
pub enum AuthResponse {
Config(AuthConfig),
User(UserInfo),
Users(Vec<UserEntry>),
CreatedUser(CreatedUser),
Link(Link),
RegisterInfo(RegisterInfo),
Cloudflare(CloudflareConfig),
Done,
}
#[cfg(feature = "musliweb05")]
mod musli {
use alloc::vec::Vec;
use musli_core02::en::{Encode, Encoder};
use super::AuthResponse;
use crate::{
AuthConfig, CloudflareConfig, CreatedUser, Link, RegisterInfo, UserEntry, UserInfo,
};
#[cfg_attr(watchword_docsrs, doc(cfg(feature = "musliweb05")))]
impl<M> Encode<M> for AuthResponse
where
M: 'static,
AuthConfig: Encode<M>,
UserInfo: Encode<M>,
Vec<UserEntry>: Encode<M>,
CreatedUser: Encode<M>,
Link: Encode<M>,
RegisterInfo: Encode<M>,
CloudflareConfig: Encode<M>,
(): Encode<M>,
{
type Encode = Self;
fn encode<E>(&self, encoder: E) -> Result<(), E::Error>
where
E: Encoder<Mode = M>,
{
match self {
AuthResponse::Config(value) => value.encode(encoder),
AuthResponse::User(value) => value.encode(encoder),
AuthResponse::Users(value) => value.encode(encoder),
AuthResponse::CreatedUser(value) => value.encode(encoder),
AuthResponse::Link(value) => value.encode(encoder),
AuthResponse::RegisterInfo(value) => value.encode(encoder),
AuthResponse::Cloudflare(value) => value.encode(encoder),
AuthResponse::Done => ().encode(encoder),
}
}
fn as_encode(&self) -> &Self::Encode {
self
}
}
}