From bca331252ace3f9170cc96f1c35b576ff1ee0cf8 Mon Sep 17 00:00:00 2001 From: Julio Biason Date: Thu, 22 Oct 2020 18:14:55 -0300 Subject: [PATCH] Adding metals --- src/actions.rs | 6 ++++++ src/args.rs | 25 +++++++++++++++++++++++++ src/main.rs | 3 ++- src/repository.rs | 27 ++++++++++++++++++++------- 4 files changed, 53 insertions(+), 8 deletions(-) diff --git a/src/actions.rs b/src/actions.rs index 9f1436c..244f5e3 100644 --- a/src/actions.rs +++ b/src/actions.rs @@ -25,6 +25,12 @@ pub enum Action { AdjectiveAdd(String), /// Delete an adjective AdjectiveRm(String), + /// List metals + MetalList, + /// Add a new metal + MetalAdd(String), + /// Remove a metal + MetalRm(String), /// Generate a name from the description. Generate(String), } diff --git a/src/args.rs b/src/args.rs index 83bc837..9fa9a4c 100644 --- a/src/args.rs +++ b/src/args.rs @@ -34,6 +34,7 @@ pub enum ParseError { UnknownCommand, MissingDescription, MissingAdjective, + MissingMetal, } pub fn parse() -> ParseResult { @@ -84,6 +85,7 @@ pub fn parse() -> ParseResult { match matches.subcommand() { ("generate", Some(arguments)) => parse_generate(arguments), ("adjectives", Some(arguments)) => parse_adjectives(arguments), + ("metals", Some(arguments)) => parse_metals(arguments), _ => Err(ParseError::UnknownCommand), } } @@ -117,3 +119,26 @@ fn parse_adjectives_rm(arguments: &ArgMatches) -> ParseResult { .ok_or(ParseError::MissingAdjective)?; Ok(Action::AdjectiveRm(adjective.to_string())) } + +fn parse_metals(arguments: &ArgMatches) -> ParseResult { + match arguments.subcommand() { + ("list", _) => Ok(Action::MetalList), + ("add", Some(arguments)) => parse_metal_add(arguments), + ("rm", Some(arguments)) => parse_metal_rm(arguments), + (_, _) => Err(ParseError::UnknownCommand), + } +} + +fn parse_metal_add(arguments: &ArgMatches) -> ParseResult { + let metal = arguments + .value_of("metal") + .ok_or(ParseError::MissingMetal)?; + Ok(Action::MetalAdd(metal.to_string())) +} + +fn parse_metal_rm(arguments: &ArgMatches) -> ParseResult { + let metal = arguments + .value_of("metal") + .ok_or(ParseError::MissingMetal)?; + Ok(Action::MetalRm(metal.to_string())) +} diff --git a/src/main.rs b/src/main.rs index e4566a5..3284806 100644 --- a/src/main.rs +++ b/src/main.rs @@ -24,8 +24,9 @@ fn main() { match args::parse() { Ok(x) => match x { actions::Action::AdjectiveAdd(word) => { - repository::WordList::insert_adjective(&word).unwrap(); + repository::WordList::insert_adjective(&word).unwrap() } + actions::Action::MetalAdd(word) => repository::WordList::insert_metal(&word).unwrap(), _ => unimplemented!(), }, Err(x) => println!("Error {:?}", x), diff --git a/src/repository.rs b/src/repository.rs index 74975f2..4683b6c 100644 --- a/src/repository.rs +++ b/src/repository.rs @@ -73,24 +73,37 @@ impl WordList { /// add an adjective to the word list pub fn insert_adjective(adjective: &str) -> Result<(), WordListError> { let mut repo = Self::load()?; - let initial = adjective + Self::insert_word(adjective, &mut repo.adjectives)?; + repo.save() + } + + /// Add a metal to the word list + pub fn insert_metal(metal: &str) -> Result<(), WordListError> { + let mut repo = Self::load()?; + Self::insert_word(metal, &mut repo.metals)?; + repo.save() + } + + /// Generic function to insert words in the storage; the target points in which of the lists + /// the word should be inserted. + fn insert_word(word: &str, target: &mut WordStorage) -> Result<(), WordListError> { + let initial = word .chars() .nth(0) .ok_or(WordListError::InvalidWord)? .to_string(); - let mut list = if !repo.adjectives.contains_key(&initial) { + let mut list = if !target.contains_key(&initial) { let empty_list = LinkedList::new(); empty_list } else { - repo.adjectives.get(&initial).unwrap().to_owned() + target.get(&initial).unwrap().to_owned() }; - if list.contains(&adjective.to_string()) { + if list.contains(&word.to_string()) { Err(WordListError::WordAlreadyExists) } else { - list.push_back(adjective.to_string()); - repo.adjectives.insert(initial, list); - repo.save()?; + list.push_back(word.to_string()); + target.insert(initial, list); Ok(()) } }