use serde::de::DeserializeOwned;
use serde::{Deserialize, Serialize, Serializer};
pub trait Token: DeserializeOwned + Serialize {
const NAME: &'static str;
fn name(&self) -> &'static str {
Self::NAME
}
fn generate_password(&self) -> String;
}
#[derive(Debug, Deserialize)]
pub enum GenericToken {
Yubikey(crate::yubikey::Yubikey),
TOTP(crate::otp::TOTP),
}
impl Serialize for GenericToken {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
match self {
GenericToken::Yubikey(key) => key.serialize(serializer),
GenericToken::TOTP(key) => key.serialize(serializer),
}
}
}
impl Token for GenericToken {
const NAME: &'static str = "uninitialized";
fn name(&self) -> &'static str {
match self {
GenericToken::Yubikey(key) => key.name(),
GenericToken::TOTP(key) => key.name(),
}
}
fn generate_password(&self) -> String {
match self {
GenericToken::Yubikey(key) => key.generate_password(),
GenericToken::TOTP(key) => key.generate_password(),
}
}
}