diff --git a/src/error.rs b/src/error.rs new file mode 100644 index 0000000..6aff61b --- /dev/null +++ b/src/error.rs @@ -0,0 +1,3 @@ +// TODO: expand +#[derive(Debug, Clone)] +pub struct Error; diff --git a/src/lib.rs b/src/lib.rs index 649554c..8850eae 100755 --- a/src/lib.rs +++ b/src/lib.rs @@ -156,3 +156,6 @@ mod bcn; /// Reading the binary .dat files in the user folder (e.g. GEARSET.dat) pub mod dat; + +mod error; +pub use error::Error; diff --git a/src/race.rs b/src/race.rs index fef7d1b..4895616 100755 --- a/src/race.rs +++ b/src/race.rs @@ -3,6 +3,8 @@ use binrw::binrw; +use crate::Error; + /// The playable genders in the game. #[binrw] #[brw(repr = u8)] @@ -13,6 +15,18 @@ pub enum Gender { Female = 1, } +impl std::convert::TryFrom for Gender { + type Error = crate::Error; + + fn try_from(value: u8) -> Result { + match value { + 0 => Ok(Self::Male), + 1 => Ok(Self::Female), + _ => Err(Error {}), + } + } +} + /// The playable tribes in the game. /// Each race has two similar-looking tribes, with the exception of Highlander Hyur which are visually distinct. #[binrw] @@ -38,6 +52,32 @@ pub enum Tribe { Veena = 16, } +impl std::convert::TryFrom for Tribe { + type Error = crate::Error; + + fn try_from(value: u8) -> Result { + match value { + 1 => Ok(Self::Midlander), + 2 => Ok(Self::Highlander), + 3 => Ok(Self::Wildwood), + 4 => Ok(Self::Duskwight), + 5 => Ok(Self::Plainsfolk), + 6 => Ok(Self::Dunesfolk), + 7 => Ok(Self::Seeker), + 8 => Ok(Self::Keeper), + 9 => Ok(Self::SeaWolf), + 10 => Ok(Self::Hellsguard), + 11 => Ok(Self::Raen), + 12 => Ok(Self::Xaela), + 13 => Ok(Self::Hellion), + 14 => Ok(Self::Lost), + 15 => Ok(Self::Rava), + 16 => Ok(Self::Veena), + _ => Err(Error {}), + } + } +} + /// The playable races in the game. #[binrw] #[brw(repr = u8)] @@ -54,6 +94,24 @@ pub enum Race { Viera = 8, } +impl std::convert::TryFrom for Race { + type Error = crate::Error; + + fn try_from(value: u8) -> Result { + match value { + 1 => Ok(Self::Hyur), + 2 => Ok(Self::Elezen), + 3 => Ok(Self::Lalafell), + 4 => Ok(Self::Miqote), + 5 => Ok(Self::Roegadyn), + 6 => Ok(Self::AuRa), + 7 => Ok(Self::Hrothgar), + 8 => Ok(Self::Viera), + _ => Err(Error {}), + } + } +} + /// Gets a proper race identifier (such as 101, for Hyur-Midlander-Males) given a race, a tribe, /// and a gender. pub fn get_race_id(race: Race, tribe: Tribe, gender: Gender) -> Option { @@ -93,12 +151,10 @@ pub fn get_race_id(race: Race, tribe: Tribe, gender: Gender) -> Option { Gender::Male => Some(1301), Gender::Female => Some(1401), }, - Race::Hrothgar => { - match gender { - Gender::Male => Some(1501), - Gender::Female => Some(1601), - } - } + Race::Hrothgar => match gender { + Gender::Male => Some(1501), + Gender::Female => Some(1601), + }, Race::Viera => match gender { Gender::Male => Some(1701), Gender::Female => Some(1801),