use crate::account_manager::AccountManager;
use crate::misc::AccountError;
use crate::prelude::ClientNetworkAccount;
use async_trait::async_trait;
use citadel_crypt::ratchets::Ratchet;
use citadel_types::user::MutualPeer;
use citadel_types::user::UserIdentifier;
pub const CNAC_SERIALIZED_EXTENSION: &str = "hca";
#[async_trait]
pub trait UserIdentifierExt {
type Error;
async fn search<R: Ratchet, Fcm: Ratchet>(
&self,
account_manager: &AccountManager<R, Fcm>,
) -> Result<Option<ClientNetworkAccount<R, Fcm>>, Self::Error>;
async fn search_peer<R: Ratchet, Fcm: Ratchet>(
&self,
session_cid: u64,
account_manager: &AccountManager<R, Fcm>,
) -> Result<Option<MutualPeer>, Self::Error>;
fn get_cid(&self) -> u64;
}
#[async_trait]
impl UserIdentifierExt for UserIdentifier {
type Error = AccountError;
async fn search<R: Ratchet, Fcm: Ratchet>(
&self,
account_manager: &AccountManager<R, Fcm>,
) -> Result<Option<ClientNetworkAccount<R, Fcm>>, AccountError> {
match self {
Self::ID(cid) => account_manager.get_client_by_cid(*cid).await,
Self::Username(uname) => account_manager.get_client_by_username(uname).await,
}
}
async fn search_peer<R: Ratchet, Fcm: Ratchet>(
&self,
session_cid: u64,
account_manager: &AccountManager<R, Fcm>,
) -> Result<Option<MutualPeer>, AccountError> {
match self {
UserIdentifier::ID(cid) => {
account_manager
.get_persistence_handler()
.get_hyperlan_peer_by_cid(session_cid, *cid)
.await
}
UserIdentifier::Username(name) => {
account_manager
.get_persistence_handler()
.get_hyperlan_peer_by_username(session_cid, name.as_str())
.await
}
}
}
fn get_cid(&self) -> u64 {
match self {
UserIdentifier::ID(cid) => *cid,
UserIdentifier::Username(uname) => citadel_types::user::username_to_cid(uname),
}
}
}