Browse Source

Parsing all adjectives commands now

master
Julio Biason 4 years ago
parent
commit
9d678868e5
  1. 6
      src/actions.rs
  2. 45
      src/args.rs
  3. 4
      src/main.rs
  4. 24
      src/repository.rs

6
src/actions.rs

@ -19,6 +19,12 @@
/// List of actions available /// List of actions available
#[derive(Debug)] #[derive(Debug)]
pub enum Action { pub enum Action {
/// List adjectives
AdjectiveList,
/// Add a new adjective
AdjectiveAdd(String),
/// Delete an adjective
AdjectiveRm(String),
/// Generate a name from the description. /// Generate a name from the description.
Generate(String), Generate(String),
} }

45
src/args.rs

@ -22,18 +22,21 @@ use clap::crate_name;
use clap::crate_version; use clap::crate_version;
use clap::App; use clap::App;
use clap::Arg; use clap::Arg;
// use clap::ArgMatches; use clap::ArgMatches;
use clap::SubCommand; use clap::SubCommand;
use crate::actions::Action; use crate::actions::Action;
type ParseResult = Result<Action, ParseError>;
#[derive(Debug)] #[derive(Debug)]
pub enum ParseError { pub enum ParseError {
UnknownCommand, UnknownCommand,
MissingDescription, MissingDescription,
MissingAdjective,
} }
pub fn parse() -> Result<Action, ParseError> { pub fn parse() -> ParseResult {
let params = App::new(crate_name!()) let params = App::new(crate_name!())
.version(crate_version!()) .version(crate_version!())
.author(crate_authors!()) .author(crate_authors!())
@ -79,12 +82,38 @@ pub fn parse() -> Result<Action, ParseError> {
); );
let matches = params.get_matches(); let matches = params.get_matches();
match matches.subcommand() { match matches.subcommand() {
("generate", Some(arguments)) => { ("generate", Some(arguments)) => parse_generate(arguments),
let description = arguments ("adjectives", Some(arguments)) => parse_adjectives(arguments),
.value_of("description")
.ok_or(ParseError::MissingDescription)?;
Ok(Action::Generate(description.to_string()))
}
_ => Err(ParseError::UnknownCommand), _ => 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()))
}

4
src/main.rs

@ -18,13 +18,13 @@
mod actions; mod actions;
mod args; mod args;
mod database; mod repository;
fn main() { fn main() {
match args::parse() { match args::parse() {
Ok(x) => { Ok(x) => {
println!("Ok: {:?}", x); println!("Ok: {:?}", x);
if let Ok(_db) = database::Database::load() { if let Ok(_db) = repository::WordList::load() {
println!("Has db"); println!("Has db");
} else { } else {
println!("Do not has db"); println!("Do not has db");

24
src/database.rs → src/repository.rs

@ -10,45 +10,45 @@ use toml;
type WordStorage = BTreeMap<char, LinkedList<String>>; type WordStorage = BTreeMap<char, LinkedList<String>>;
#[derive(Debug, Serialize, Deserialize)] #[derive(Debug, Serialize, Deserialize)]
pub struct Database { pub struct WordList {
adjectives: WordStorage, adjectives: WordStorage,
metals: WordStorage, metals: WordStorage,
} }
pub enum DatabaseError { pub enum WordListError {
InvalidFormat, InvalidFormat,
} }
impl std::convert::From<std::io::Error> for DatabaseError { impl std::convert::From<std::io::Error> for WordListError {
fn from(_error: std::io::Error) -> DatabaseError { fn from(_error: std::io::Error) -> WordListError {
DatabaseError::InvalidFormat WordListError::InvalidFormat
} }
} }
impl std::convert::From<toml::de::Error> for DatabaseError { impl std::convert::From<toml::de::Error> for WordListError {
fn from(_error: toml::de::Error) -> DatabaseError { fn from(_error: toml::de::Error) -> WordListError {
DatabaseError::InvalidFormat WordListError::InvalidFormat
} }
} }
impl Database { impl WordList {
/// Create an empty database /// Create an empty database
fn empty() -> Self { fn empty() -> Self {
Database { WordList {
adjectives: WordStorage::new(), adjectives: WordStorage::new(),
metals: WordStorage::new(), metals: WordStorage::new(),
} }
} }
/// Load the database /// Load the database
pub fn load() -> Result<Self, DatabaseError> { pub fn load() -> Result<Self, WordListError> {
if let Ok(mut fp) = File::open("database.toml") { if let Ok(mut fp) = File::open("database.toml") {
let mut content = String::new(); let mut content = String::new();
fp.read_to_string(&mut content)?; fp.read_to_string(&mut content)?;
let data = toml::from_str(&content)?; let data = toml::from_str(&content)?;
Ok(data) Ok(data)
} else { } else {
Ok(Database::empty()) Ok(WordList::empty())
} }
} }
} }
Loading…
Cancel
Save