use anyhow::{Context, Result, bail};
use bc_envelope::prelude::*;
#[derive(Clone, Copy, PartialEq)]
pub enum MnemonicLanguage {
English = 0,
SimplifiedChinese = 1,
TraditionalChinese = 2,
Czech = 3,
French = 4,
Italian = 5,
Japanese = 6,
Korean = 7,
Portuguese = 8,
Spanish = 9,
}
impl MnemonicLanguage {
pub fn from_u32(value: u32) -> Result<Self> {
match value {
0 => Ok(MnemonicLanguage::English),
1 => Ok(MnemonicLanguage::SimplifiedChinese),
2 => Ok(MnemonicLanguage::TraditionalChinese),
3 => Ok(MnemonicLanguage::Czech),
4 => Ok(MnemonicLanguage::French),
5 => Ok(MnemonicLanguage::Italian),
6 => Ok(MnemonicLanguage::Japanese),
7 => Ok(MnemonicLanguage::Korean),
8 => Ok(MnemonicLanguage::Portuguese),
9 => Ok(MnemonicLanguage::Spanish),
_ => bail!("Invalid language value: {}", value),
}
}
pub fn name(&self) -> &'static str {
match self {
MnemonicLanguage::English => "English",
MnemonicLanguage::SimplifiedChinese => "SimplifiedChinese",
MnemonicLanguage::TraditionalChinese => "TraditionalChinese",
MnemonicLanguage::Czech => "Czech",
MnemonicLanguage::French => "French",
MnemonicLanguage::Italian => "Italian",
MnemonicLanguage::Japanese => "Japanese",
MnemonicLanguage::Korean => "Korean",
MnemonicLanguage::Portuguese => "Portuguese",
MnemonicLanguage::Spanish => "Spanish",
}
}
}
impl std::fmt::Display for MnemonicLanguage {
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
write!(f, "{}", self.name())
}
}
impl std::fmt::Debug for MnemonicLanguage {
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
write!(f, "{}", self)
}
}
impl From<MnemonicLanguage> for String {
fn from(value: MnemonicLanguage) -> Self {
match value {
MnemonicLanguage::English => "en".to_string(),
MnemonicLanguage::SimplifiedChinese => "zh-Hans".to_string(),
MnemonicLanguage::TraditionalChinese => "zh-Hant".to_string(),
MnemonicLanguage::Czech => "cs".to_string(),
MnemonicLanguage::French => "fr".to_string(),
MnemonicLanguage::Italian => "it".to_string(),
MnemonicLanguage::Japanese => "ja".to_string(),
MnemonicLanguage::Korean => "ko".to_string(),
MnemonicLanguage::Portuguese => "pt".to_string(),
MnemonicLanguage::Spanish => "es".to_string(),
}
}
}
impl TryFrom<String> for MnemonicLanguage {
type Error = anyhow::Error;
fn try_from(value: String) -> Result<Self, Self::Error> {
match value.as_str() {
"en" => Ok(MnemonicLanguage::English),
"zh-Hans" => Ok(MnemonicLanguage::SimplifiedChinese),
"zh-Hant" => Ok(MnemonicLanguage::TraditionalChinese),
"cs" => Ok(MnemonicLanguage::Czech),
"fr" => Ok(MnemonicLanguage::French),
"it" => Ok(MnemonicLanguage::Italian),
"ja" => Ok(MnemonicLanguage::Japanese),
"ko" => Ok(MnemonicLanguage::Korean),
"pt" => Ok(MnemonicLanguage::Portuguese),
"es" => Ok(MnemonicLanguage::Spanish),
_ => bail!("Invalid MnemonicLanguage string: {}", value),
}
}
}
impl From<MnemonicLanguage> for CBOR {
fn from(value: MnemonicLanguage) -> Self {
String::from(value).into()
}
}
impl TryFrom<CBOR> for MnemonicLanguage {
type Error = dcbor::Error;
fn try_from(cbor: CBOR) -> dcbor::Result<Self> {
Ok(cbor.try_into_text()?.try_into()?)
}
}
impl From<MnemonicLanguage> for Envelope {
fn from(value: MnemonicLanguage) -> Self {
Envelope::new(String::from(value))
}
}
impl TryFrom<Envelope> for MnemonicLanguage {
type Error = anyhow::Error;
fn try_from(envelope: Envelope) -> Result<Self, Self::Error> {
let language_str: String = envelope.extract_subject().context("MnemonicLanguage")?;
MnemonicLanguage::try_from(language_str)
}
}
#[cfg(test)]
mod tests {
use crate::{test_cbor_roundtrip, test_envelope_roundtrip};
use super::MnemonicLanguage;
impl crate::RandomInstance for MnemonicLanguage {
fn random() -> Self {
MnemonicLanguage::from_u32(rand::random::<u8>() as u32 % 10).unwrap()
}
}
test_cbor_roundtrip!(MnemonicLanguage);
test_envelope_roundtrip!(MnemonicLanguage);
}