mod constants {
pub const SPACE_MARK: char = ' ';
pub const LETTER_BEITH: char = 'ᚁ';
pub const LETTER_LUIS: char = 'ᚂ';
pub const LETTER_FEARN: char = 'ᚃ';
pub const LETTER_SAIL: char = 'ᚄ';
pub const LETTER_NION: char = 'ᚅ';
pub const LETTER_UATH: char = 'ᚆ';
pub const LETTER_DAIR: char = 'ᚇ';
pub const LETTER_TINNE: char = 'ᚈ';
pub const LETTER_COLL: char = 'ᚉ';
pub const LETTER_CEIRT: char = 'ᚊ';
pub const LETTER_MUIN: char = 'ᚋ';
pub const LETTER_GORT: char = 'ᚌ';
pub const LETTER_NGEADAL: char = 'ᚍ';
pub const LETTER_STRAIF: char = 'ᚎ';
pub const LETTER_RUIS: char = 'ᚏ';
pub const LETTER_AILM: char = 'ᚐ';
pub const LETTER_ONN: char = 'ᚑ';
pub const LETTER_UR: char = 'ᚒ';
pub const LETTER_EADHADH: char = 'ᚓ';
pub const LETTER_IODHADH: char = 'ᚔ';
pub const LETTER_EABHADH: char = 'ᚕ';
pub const LETTER_OR: char = 'ᚖ';
pub const LETTER_UILLEANN: char = 'ᚗ';
pub const LETTER_IFIN: char = 'ᚘ';
pub const LETTER_EAMHANCHOLL: char = 'ᚙ';
pub const LETTER_PEITH: char = 'ᚚ';
pub const FEATHER_MARK: char = '᚛';
pub const REVERSED_FEATHER_MARK: char = '᚜';
}
#[derive(Debug, Clone, Copy, Hash, PartialEq, Eq)]
pub enum Ogham {
SpaceMark,
LetterBeith,
LetterLuis,
LetterFearn,
LetterSail,
LetterNion,
LetterUath,
LetterDair,
LetterTinne,
LetterColl,
LetterCeirt,
LetterMuin,
LetterGort,
LetterNgeadal,
LetterStraif,
LetterRuis,
LetterAilm,
LetterOnn,
LetterUr,
LetterEadhadh,
LetterIodhadh,
LetterEabhadh,
LetterOr,
LetterUilleann,
LetterIfin,
LetterEamhancholl,
LetterPeith,
FeatherMark,
ReversedFeatherMark,
}
impl Into<char> for Ogham {
fn into(self) -> char {
use constants::*;
match self {
Ogham::SpaceMark => SPACE_MARK,
Ogham::LetterBeith => LETTER_BEITH,
Ogham::LetterLuis => LETTER_LUIS,
Ogham::LetterFearn => LETTER_FEARN,
Ogham::LetterSail => LETTER_SAIL,
Ogham::LetterNion => LETTER_NION,
Ogham::LetterUath => LETTER_UATH,
Ogham::LetterDair => LETTER_DAIR,
Ogham::LetterTinne => LETTER_TINNE,
Ogham::LetterColl => LETTER_COLL,
Ogham::LetterCeirt => LETTER_CEIRT,
Ogham::LetterMuin => LETTER_MUIN,
Ogham::LetterGort => LETTER_GORT,
Ogham::LetterNgeadal => LETTER_NGEADAL,
Ogham::LetterStraif => LETTER_STRAIF,
Ogham::LetterRuis => LETTER_RUIS,
Ogham::LetterAilm => LETTER_AILM,
Ogham::LetterOnn => LETTER_ONN,
Ogham::LetterUr => LETTER_UR,
Ogham::LetterEadhadh => LETTER_EADHADH,
Ogham::LetterIodhadh => LETTER_IODHADH,
Ogham::LetterEabhadh => LETTER_EABHADH,
Ogham::LetterOr => LETTER_OR,
Ogham::LetterUilleann => LETTER_UILLEANN,
Ogham::LetterIfin => LETTER_IFIN,
Ogham::LetterEamhancholl => LETTER_EAMHANCHOLL,
Ogham::LetterPeith => LETTER_PEITH,
Ogham::FeatherMark => FEATHER_MARK,
Ogham::ReversedFeatherMark => REVERSED_FEATHER_MARK,
}
}
}
impl std::convert::TryFrom<char> for Ogham {
type Error = ();
fn try_from(c: char) -> Result<Self, Self::Error> {
use constants::*;
match c {
SPACE_MARK => Ok(Ogham::SpaceMark),
LETTER_BEITH => Ok(Ogham::LetterBeith),
LETTER_LUIS => Ok(Ogham::LetterLuis),
LETTER_FEARN => Ok(Ogham::LetterFearn),
LETTER_SAIL => Ok(Ogham::LetterSail),
LETTER_NION => Ok(Ogham::LetterNion),
LETTER_UATH => Ok(Ogham::LetterUath),
LETTER_DAIR => Ok(Ogham::LetterDair),
LETTER_TINNE => Ok(Ogham::LetterTinne),
LETTER_COLL => Ok(Ogham::LetterColl),
LETTER_CEIRT => Ok(Ogham::LetterCeirt),
LETTER_MUIN => Ok(Ogham::LetterMuin),
LETTER_GORT => Ok(Ogham::LetterGort),
LETTER_NGEADAL => Ok(Ogham::LetterNgeadal),
LETTER_STRAIF => Ok(Ogham::LetterStraif),
LETTER_RUIS => Ok(Ogham::LetterRuis),
LETTER_AILM => Ok(Ogham::LetterAilm),
LETTER_ONN => Ok(Ogham::LetterOnn),
LETTER_UR => Ok(Ogham::LetterUr),
LETTER_EADHADH => Ok(Ogham::LetterEadhadh),
LETTER_IODHADH => Ok(Ogham::LetterIodhadh),
LETTER_EABHADH => Ok(Ogham::LetterEabhadh),
LETTER_OR => Ok(Ogham::LetterOr),
LETTER_UILLEANN => Ok(Ogham::LetterUilleann),
LETTER_IFIN => Ok(Ogham::LetterIfin),
LETTER_EAMHANCHOLL => Ok(Ogham::LetterEamhancholl),
LETTER_PEITH => Ok(Ogham::LetterPeith),
FEATHER_MARK => Ok(Ogham::FeatherMark),
REVERSED_FEATHER_MARK => Ok(Ogham::ReversedFeatherMark),
_ => Err(()),
}
}
}
impl Into<u32> for Ogham {
fn into(self) -> u32 {
let c: char = self.into();
let hex = c
.escape_unicode()
.to_string()
.replace("\\u{", "")
.replace("}", "");
u32::from_str_radix(&hex, 16).unwrap()
}
}
impl std::convert::TryFrom<u32> for Ogham {
type Error = ();
fn try_from(u: u32) -> Result<Self, Self::Error> {
if let Ok(c) = char::try_from(u) {
Self::try_from(c)
} else {
Err(())
}
}
}
impl Iterator for Ogham {
type Item = Self;
fn next(&mut self) -> Option<Self> {
let index: u32 = (*self).into();
use std::convert::TryFrom;
Self::try_from(index + 1).ok()
}
}
impl Ogham {
pub fn new() -> Self {
Ogham::SpaceMark
}
pub fn name(&self) -> &str {
match self {
Ogham::SpaceMark => "ogham space mark",
Ogham::LetterBeith => "ogham letter beith",
Ogham::LetterLuis => "ogham letter luis",
Ogham::LetterFearn => "ogham letter fearn",
Ogham::LetterSail => "ogham letter sail",
Ogham::LetterNion => "ogham letter nion",
Ogham::LetterUath => "ogham letter uath",
Ogham::LetterDair => "ogham letter dair",
Ogham::LetterTinne => "ogham letter tinne",
Ogham::LetterColl => "ogham letter coll",
Ogham::LetterCeirt => "ogham letter ceirt",
Ogham::LetterMuin => "ogham letter muin",
Ogham::LetterGort => "ogham letter gort",
Ogham::LetterNgeadal => "ogham letter ngeadal",
Ogham::LetterStraif => "ogham letter straif",
Ogham::LetterRuis => "ogham letter ruis",
Ogham::LetterAilm => "ogham letter ailm",
Ogham::LetterOnn => "ogham letter onn",
Ogham::LetterUr => "ogham letter ur",
Ogham::LetterEadhadh => "ogham letter eadhadh",
Ogham::LetterIodhadh => "ogham letter iodhadh",
Ogham::LetterEabhadh => "ogham letter eabhadh",
Ogham::LetterOr => "ogham letter or",
Ogham::LetterUilleann => "ogham letter uilleann",
Ogham::LetterIfin => "ogham letter ifin",
Ogham::LetterEamhancholl => "ogham letter eamhancholl",
Ogham::LetterPeith => "ogham letter peith",
Ogham::FeatherMark => "ogham feather mark",
Ogham::ReversedFeatherMark => "ogham reversed feather mark",
}
}
}