use minicbor::data::Tag;
use minicbor::decode::Error;
use minicbor::encode::Write;
use minicbor::{Decode, Decoder, Encode, Encoder};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum Model {
FoundersEdition,
Batch2,
}
impl Model {
pub const TAG: Tag = Tag::new(721);
}
impl<'b, C> Decode<'b, C> for Model {
fn decode(d: &mut Decoder<'b>, _ctx: &mut C) -> Result<Self, Error> {
Model::try_from(d.u32()?).map_err(|_| Error::message("invalid passport-model"))
}
}
impl<C> Encode<C> for Model {
fn encode<W: Write>(
&self,
e: &mut Encoder<W>,
_ctx: &mut C,
) -> Result<(), minicbor::encode::Error<W::Error>> {
e.u32((*self).into())?;
Ok(())
}
}
impl TryFrom<u32> for Model {
type Error = InvalidModelError;
fn try_from(number: u32) -> Result<Self, Self::Error> {
match number {
1 => Ok(Model::FoundersEdition),
2 => Ok(Model::Batch2),
_ => Err(InvalidModelError { number }),
}
}
}
impl From<Model> for u32 {
fn from(model: Model) -> Self {
match model {
Model::FoundersEdition => 1,
Model::Batch2 => 2,
}
}
}
#[derive(Debug, Clone, Copy, Eq, PartialEq)]
pub struct InvalidModelError {
pub number: u32,
}