1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77
use serde_json::Value; use thiserror::Error; use std::collections::HashSet; pub struct Word { pub word: String, pub synonyms: Vec<String>, } #[derive(Error, Debug)] pub enum ThesaurusError { #[error("Json Error")] JsonError(String), #[error("Unknown Word")] UnknownWord, } pub fn synonym(word: &str) -> std::result::Result<Word, ThesaurusError> { let dict_jsonl: String = include_str!("en_thesaurus.jsonl").to_string(); let mut synonyms: Vec<String> = Vec::new(); for json in dict_jsonl.lines() { let parsed_json: Value = match serde_json::from_str(&json) { Ok(parsed_json) => parsed_json, Err(error) => { return Err(ThesaurusError::JsonError(format!("Couldn't parse json: {}", error))); } }; let json_word = match &parsed_json["word"] { Value::String(json_word) => json_word, _ => { return Err(ThesaurusError::JsonError("Unable to find word in parsed JSON".to_string())); } }; if json_word == word { let mut synonym_hashset: HashSet<String> = HashSet::new(); for synonym in synonyms.iter() { synonym_hashset.insert(synonym.clone()); } let json_synonyms = match &parsed_json["synonyms"] { Value::Array(json_synonyms) => json_synonyms, _ => { return Err(ThesaurusError::JsonError("Unable to find synonyms in parsed JSON".to_string())); } }; for synonym in json_synonyms.iter() { let synonym_result = match synonym { Value::String(synonym_value) => synonym_value, _ => { return Err(ThesaurusError::JsonError("Unable to find synonym values in parsed JSON".to_string())); } }; if !synonym_hashset.contains(synonym_result) { synonyms.push(synonym_result.clone()); } }; }; }; if synonyms.len() == 0 { return Err(ThesaurusError::UnknownWord); } let word_res = Word { word: word.to_string(), synonyms, }; return Ok(word_res); }