diff options
author | Daniel Schadt <kingdread@gmx.de> | 2019-12-12 01:25:28 +0100 |
---|---|---|
committer | Daniel Schadt <kingdread@gmx.de> | 2019-12-12 01:25:28 +0100 |
commit | a6afa81d1d9f2dd7d10fe7c0555ae8a8a6d84867 (patch) | |
tree | f82d523b2c3381d58af1283be6a01321fb4b0fa2 /src/main.rs | |
parent | 5350b4ece04082bf8a0a127c230669c4de9b7cc4 (diff) | |
download | kondou-a6afa81d1d9f2dd7d10fe7c0555ae8a8a6d84867.tar.gz kondou-a6afa81d1d9f2dd7d10fe7c0555ae8a8a6d84867.tar.bz2 kondou-a6afa81d1d9f2dd7d10fe7c0555ae8a8a6d84867.zip |
use helper traits for better code
Diffstat (limited to 'src/main.rs')
-rw-r--r-- | src/main.rs | 21 |
1 files changed, 17 insertions, 4 deletions
diff --git a/src/main.rs b/src/main.rs index d3839b2..181d64a 100644 --- a/src/main.rs +++ b/src/main.rs @@ -83,6 +83,19 @@ impl StdError for NotFound {} /// 2. We don't want yet another error kind with a lot of kinds. type MainResult<T> = Result<T, Box<dyn StdError>>; +/// A trait for containers that only contain a single item. +trait SingleContainer<T> { + /// Extract the single element by consuming the container. + fn single(self) -> T; +} + +impl<T> SingleContainer<T> for Vec<T> { + fn single(self) -> T { + assert_eq!(self.len(), 1, "this container must have exactly 1 element."); + self.into_iter().next().unwrap() + } +} + /// Find the profession by the given name. fn find_profession(api: &mut Api, name: &str) -> MainResult<Profession> { let profession_ids = api.get_profession_ids()?; @@ -93,7 +106,7 @@ fn find_profession(api: &mut Api, name: &str) -> MainResult<Profession> { .ok_or_else(|| NotFound::Profession(name.to_owned()))? .clone(); - Ok(api.get_professions(&[profession_id])?.remove(0)) + Ok(api.get_professions(&[profession_id])?.single()) } /// Resolve a skill. @@ -106,7 +119,7 @@ fn resolve_skill(api: &mut Api, profession: &Profession, text: &str) -> MainResu if let Ok(num_id) = numeric { let exists = profession.skills.iter().any(|s| s.id == num_id); if exists { - return Ok(api.get_skills(&[num_id])?.remove(0)); + return Ok(api.get_skills(&[num_id])?.single()); } else { return Err(NotFound::SkillId(num_id).into()); } @@ -191,10 +204,10 @@ fn run_searching(api: &mut Api, matches: &ArgMatches) -> MainResult<BuildTemplat .map(|s| resolve_skill(api, &profession, s)) .collect::<Result<Vec<_>, _>>()? } else if let Some(l) = legends.first() { - let l = api.get_legends(&[l.get_api_id().unwrap()])?.remove(0); + let l = api.get_legends(&[l.api_id().unwrap()])?.single(); let mut result = Vec::new(); for skill_id in (&[l.heal]).iter().chain(&l.utilities).chain(&[l.elite]) { - let skill = api.get_skills(&[*skill_id])?.remove(0); + let skill = api.get_skills(&[*skill_id])?.single(); result.push(skill); } result |