twoken 0.4.0

Generate One-Time Passwords from stored token secrets.
Documentation
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(),
        }
    }
}