diff --git a/src/main.rs b/src/main.rs index 7b9ff58..e4566a5 100644 --- a/src/main.rs +++ b/src/main.rs @@ -22,14 +22,12 @@ mod repository; fn main() { match args::parse() { - Ok(x) => { - println!("Ok: {:?}", x); - if let Ok(_db) = repository::WordList::load() { - println!("Has db"); - } else { - println!("Do not has db"); + Ok(x) => match x { + actions::Action::AdjectiveAdd(word) => { + repository::WordList::insert_adjective(&word).unwrap(); } - } + _ => unimplemented!(), + }, Err(x) => println!("Error {:?}", x), } } diff --git a/src/repository.rs b/src/repository.rs index 97004d6..74975f2 100644 --- a/src/repository.rs +++ b/src/repository.rs @@ -1,13 +1,13 @@ use std::collections::BTreeMap; use std::collections::LinkedList; use std::fs::File; -use std::io::Read; +use std::io::{Read, Write}; use serde_derive::Deserialize; use serde_derive::Serialize; use toml; -type WordStorage = BTreeMap>; +type WordStorage = BTreeMap>; #[derive(Debug, Serialize, Deserialize)] pub struct WordList { @@ -15,8 +15,12 @@ pub struct WordList { metals: WordStorage, } +#[derive(Debug)] pub enum WordListError { InvalidFormat, + InvalidWord, + WordAlreadyExists, + SaveFailure, } impl std::convert::From for WordListError { @@ -31,6 +35,12 @@ impl std::convert::From for WordListError { } } +impl std::convert::From for WordListError { + fn from(_error: toml::ser::Error) -> WordListError { + WordListError::SaveFailure + } +} + impl WordList { /// Create an empty database fn empty() -> Self { @@ -41,7 +51,7 @@ impl WordList { } /// Load the database - pub fn load() -> Result { + fn load() -> Result { if let Ok(mut fp) = File::open("database.toml") { let mut content = String::new(); fp.read_to_string(&mut content)?; @@ -51,4 +61,37 @@ impl WordList { Ok(WordList::empty()) } } + + /// Save the database + fn save(&self) -> Result<(), WordListError> { + let content = toml::to_string(&self).unwrap(); + let mut fp = File::create("database.toml")?; + fp.write_all(content.as_bytes())?; + Ok(()) + } + + /// add an adjective to the word list + pub fn insert_adjective(adjective: &str) -> Result<(), WordListError> { + let mut repo = Self::load()?; + let initial = adjective + .chars() + .nth(0) + .ok_or(WordListError::InvalidWord)? + .to_string(); + let mut list = if !repo.adjectives.contains_key(&initial) { + let empty_list = LinkedList::new(); + empty_list + } else { + repo.adjectives.get(&initial).unwrap().to_owned() + }; + + if list.contains(&adjective.to_string()) { + Err(WordListError::WordAlreadyExists) + } else { + list.push_back(adjective.to_string()); + repo.adjectives.insert(initial, list); + repo.save()?; + Ok(()) + } + } }