use std::str::FromStr;
use serde::{Deserialize, Deserializer, Serialize, Serializer};
use crate::{
basicpre::BasicPrefix, errors::KrError, said::SelfAddressingPrefix,
self_signing_pre::SelfSigningPrefix, Prefix,
};
#[derive(Debug, PartialEq, Clone)]
pub enum IdentifierPrefix {
Basic(BasicPrefix),
SelfAddressing(SelfAddressingPrefix),
SelfSigning(SelfSigningPrefix),
}
impl FromStr for IdentifierPrefix {
type Err = KrError;
fn from_str(s: &str) -> Result<Self, Self::Err> {
match BasicPrefix::from_str(s) {
Ok(bp) => Ok(Self::Basic(bp)),
Err(_) => match SelfAddressingPrefix::from_str(s) {
Ok(sa) => Ok(Self::SelfAddressing(sa)),
Err(_) => Ok(Self::SelfSigning(SelfSigningPrefix::from_str(s)?)),
},
}
}
}
impl Prefix for IdentifierPrefix {
fn derivative(&self) -> Vec<u8> {
match self {
Self::Basic(bp) => bp.derivative(),
Self::SelfAddressing(sap) => sap.derivative(),
Self::SelfSigning(ssp) => ssp.derivative(),
}
}
fn derivation_code(&self) -> String {
match self {
Self::Basic(bp) => bp.derivation_code(),
Self::SelfAddressing(sap) => sap.derivation_code(),
Self::SelfSigning(ssp) => ssp.derivation_code(),
}
}
}
impl Serialize for IdentifierPrefix {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
serializer.serialize_str(&self.to_str())
}
}
impl<'de> Deserialize<'de> for IdentifierPrefix {
fn deserialize<D>(deserializer: D) -> Result<IdentifierPrefix, D::Error>
where
D: Deserializer<'de>,
{
let s = String::deserialize(deserializer)?;
IdentifierPrefix::from_str(&s).map_err(serde::de::Error::custom)
}
}
impl Default for IdentifierPrefix {
fn default() -> Self {
IdentifierPrefix::SelfAddressing(SelfAddressingPrefix::default())
}
}