use ic_agent::identity::{AnonymousIdentity, BasicIdentity, DelegatedIdentity, Identity};
use std::{fmt, sync::Arc};
#[derive(Clone)]
pub enum ArcIdentity {
Anonymous(Arc<AnonymousIdentity>),
Ed25519(Arc<BasicIdentity>),
Delegated(Arc<DelegatedIdentity>),
}
impl Default for ArcIdentity {
fn default() -> Self {
ArcIdentity::Anonymous(Arc::new(AnonymousIdentity))
}
}
impl fmt::Debug for ArcIdentity {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
ArcIdentity::Anonymous(_) => write!(f, "ArcIdentity::Anonymous"),
ArcIdentity::Ed25519(_) => write!(f, "ArcIdentity::Ed25519"),
ArcIdentity::Delegated(_) => write!(f, "ArcIdentity::Delegated"),
}
}
}
impl ArcIdentity {
pub fn as_arc_identity(&self) -> Arc<dyn Identity> {
match self {
ArcIdentity::Anonymous(id) => id.clone(),
ArcIdentity::Ed25519(id) => id.clone(),
ArcIdentity::Delegated(id) => id.clone(),
}
}
pub fn public_key(&self) -> Option<Vec<u8>> {
match self {
ArcIdentity::Anonymous(id) => id.public_key(),
ArcIdentity::Ed25519(id) => id.public_key(),
ArcIdentity::Delegated(id) => id.public_key(),
}
}
}
impl From<AnonymousIdentity> for ArcIdentity {
fn from(identity: AnonymousIdentity) -> Self {
ArcIdentity::Anonymous(Arc::new(identity))
}
}
impl From<ic_agent::identity::BasicIdentity> for ArcIdentity {
fn from(identity: ic_agent::identity::BasicIdentity) -> Self {
ArcIdentity::Ed25519(Arc::new(identity))
}
}
impl From<DelegatedIdentity> for ArcIdentity {
fn from(identity: DelegatedIdentity) -> Self {
ArcIdentity::Delegated(Arc::new(identity))
}
}