From 9d678868e5d3afe97ffa37750fb81c63f9970e9d Mon Sep 17 00:00:00 2001 From: Julio Biason Date: Tue, 20 Oct 2020 15:59:46 -0300 Subject: [PATCH] Parsing all adjectives commands now --- src/actions.rs | 6 ++++ src/args.rs | 45 ++++++++++++++++++++++++------ src/main.rs | 4 +-- src/{database.rs => repository.rs} | 24 ++++++++-------- 4 files changed, 57 insertions(+), 22 deletions(-) rename src/{database.rs => repository.rs} (63%) diff --git a/src/actions.rs b/src/actions.rs index 6052a25..9f1436c 100644 --- a/src/actions.rs +++ b/src/actions.rs @@ -19,6 +19,12 @@ /// List of actions available #[derive(Debug)] pub enum Action { + /// List adjectives + AdjectiveList, + /// Add a new adjective + AdjectiveAdd(String), + /// Delete an adjective + AdjectiveRm(String), /// Generate a name from the description. Generate(String), } diff --git a/src/args.rs b/src/args.rs index af77d64..83bc837 100644 --- a/src/args.rs +++ b/src/args.rs @@ -22,18 +22,21 @@ use clap::crate_name; use clap::crate_version; use clap::App; use clap::Arg; -// use clap::ArgMatches; +use clap::ArgMatches; use clap::SubCommand; use crate::actions::Action; +type ParseResult = Result; + #[derive(Debug)] pub enum ParseError { UnknownCommand, MissingDescription, + MissingAdjective, } -pub fn parse() -> Result { +pub fn parse() -> ParseResult { let params = App::new(crate_name!()) .version(crate_version!()) .author(crate_authors!()) @@ -79,12 +82,38 @@ pub fn parse() -> Result { ); let matches = params.get_matches(); match matches.subcommand() { - ("generate", Some(arguments)) => { - let description = arguments - .value_of("description") - .ok_or(ParseError::MissingDescription)?; - Ok(Action::Generate(description.to_string())) - } + ("generate", Some(arguments)) => parse_generate(arguments), + ("adjectives", Some(arguments)) => parse_adjectives(arguments), _ => Err(ParseError::UnknownCommand), } } + +fn parse_generate(arguments: &ArgMatches) -> ParseResult { + let description = arguments + .value_of("description") + .ok_or(ParseError::MissingDescription)?; + Ok(Action::Generate(description.to_string())) +} + +fn parse_adjectives(arguments: &ArgMatches) -> ParseResult { + match arguments.subcommand() { + ("list", _) => Ok(Action::AdjectiveList), + ("add", Some(arguments)) => parse_adjectives_add(arguments), + ("rm", Some(arguments)) => parse_adjectives_rm(arguments), + (_, _) => Err(ParseError::UnknownCommand), + } +} + +fn parse_adjectives_add(arguments: &ArgMatches) -> ParseResult { + let adjective = arguments + .value_of("adjective") + .ok_or(ParseError::MissingAdjective)?; + Ok(Action::AdjectiveAdd(adjective.to_string())) +} + +fn parse_adjectives_rm(arguments: &ArgMatches) -> ParseResult { + let adjective = arguments + .value_of("adjective") + .ok_or(ParseError::MissingAdjective)?; + Ok(Action::AdjectiveRm(adjective.to_string())) +} diff --git a/src/main.rs b/src/main.rs index 2d18b46..7b9ff58 100644 --- a/src/main.rs +++ b/src/main.rs @@ -18,13 +18,13 @@ mod actions; mod args; -mod database; +mod repository; fn main() { match args::parse() { Ok(x) => { println!("Ok: {:?}", x); - if let Ok(_db) = database::Database::load() { + if let Ok(_db) = repository::WordList::load() { println!("Has db"); } else { println!("Do not has db"); diff --git a/src/database.rs b/src/repository.rs similarity index 63% rename from src/database.rs rename to src/repository.rs index 92a5a3a..97004d6 100644 --- a/src/database.rs +++ b/src/repository.rs @@ -10,45 +10,45 @@ use toml; type WordStorage = BTreeMap>; #[derive(Debug, Serialize, Deserialize)] -pub struct Database { +pub struct WordList { adjectives: WordStorage, metals: WordStorage, } -pub enum DatabaseError { +pub enum WordListError { InvalidFormat, } -impl std::convert::From for DatabaseError { - fn from(_error: std::io::Error) -> DatabaseError { - DatabaseError::InvalidFormat +impl std::convert::From for WordListError { + fn from(_error: std::io::Error) -> WordListError { + WordListError::InvalidFormat } } -impl std::convert::From for DatabaseError { - fn from(_error: toml::de::Error) -> DatabaseError { - DatabaseError::InvalidFormat +impl std::convert::From for WordListError { + fn from(_error: toml::de::Error) -> WordListError { + WordListError::InvalidFormat } } -impl Database { +impl WordList { /// Create an empty database fn empty() -> Self { - Database { + WordList { adjectives: WordStorage::new(), metals: WordStorage::new(), } } /// Load the database - pub fn load() -> Result { + pub fn load() -> Result { if let Ok(mut fp) = File::open("database.toml") { let mut content = String::new(); fp.read_to_string(&mut content)?; let data = toml::from_str(&content)?; Ok(data) } else { - Ok(Database::empty()) + Ok(WordList::empty()) } } }