/* NRP - Name Rust Program Copyright (C) 2020 Julio Biason This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ mod actions; mod args; mod repository; #[derive(Debug)] enum Error { NoAdjectiveWith(String), NoMetalWith(String), } fn main() { match args::parse() { Ok(x) => match x { actions::Action::AdjectiveList => { show_words(&repository::WordList::find_all_adjectives().unwrap()); } actions::Action::AdjectiveAdd(word) => { repository::WordList::insert_adjective(&word).unwrap() } actions::Action::AdjectiveRm(word) => { repository::WordList::remove_adjective(&word).unwrap() } actions::Action::MetalList => { show_words(&repository::WordList::find_all_metals().unwrap()) } actions::Action::MetalAdd(word) => repository::WordList::insert_metal(&word).unwrap(), actions::Action::MetalRm(word) => repository::WordList::remove_metal(&word).unwrap(), actions::Action::Generate(description) => { println!("{}", generate(&description).unwrap()); } }, Err(x) => println!("Error {:?}", x), } } fn show_words(list: &repository::WordStorage) { let blank = String::from(" "); for (first_letter, word_list) in list { let heading = first_letter.to_uppercase(); for (pos, word) in word_list.iter().enumerate() { println!("{} {}", if pos == 0 { &heading } else { &blank }, word); } } } fn generate(description: &str) -> Result { let content = repository::WordList::load().unwrap(); let initials = String::from(description) .trim() .split_whitespace() .map(|word| word.chars().nth(0).unwrap().to_string()) .collect::>(); let number_of_initials = initials.len() - 1; let mut result = Vec::new(); for (pos, letter) in initials.iter().enumerate() { result.push(if pos == number_of_initials { content .get_random_metal(&letter) .map_err(|_| Error::NoMetalWith(letter.to_string()))? } else { content .get_random_adjective(&letter) .map_err(|_| Error::NoAdjectiveWith(letter.to_string()))? }); } Ok(result.join(" ")) }