use std::collections::HashMap; use std::error::Error; /// Check spelling result #[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] pub struct CheckResult { pub program: String, pub version: String, pub lang: String, pub error: String, #[serde(rename = "data")] pub paragraphs: Vec, } #[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] pub struct Paragraph { #[serde(rename = "iParagraph")] pub num: usize, #[serde(rename = "lGrammarErrors")] pub grammars: Vec, #[serde(rename = "lSpellingErrors")] pub spelling: Vec, } #[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] pub struct GrammarError { #[serde(rename = "nStart")] pub offset_start: usize, #[serde(rename = "nEnd")] pub offset_end: usize, #[serde(rename = "sLineId")] pub rule_line_id: String, #[serde(rename = "sRuleId")] pub rule_id: String, #[serde(rename = "sType")] pub rule_type: String, #[serde(rename = "aColor")] pub rule_underline_color: Vec, #[serde(rename = "sMessage")] pub message: String, #[serde(rename = "aSuggestions")] pub suggestions: Vec, #[serde(rename = "URL")] pub url: String, } #[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] pub struct SpellingError { pub i: usize, #[serde(rename = "nStart")] pub offset_start: usize, #[serde(rename = "nEnd")] pub offset_end: usize, #[serde(rename = "sValue")] pub bad_word: String, #[serde(rename = "sType")] pub error_type: String, } pub struct GrammalecteClient { base_url: String, } impl Default for GrammalecteClient { fn default() -> Self { Self { base_url: "http://localhost:8080".to_string(), } } } impl GrammalecteClient { /// Construct a new Grammalecte client, with a custom server URL pub fn new(base_url: &str) -> Self { Self { base_url: base_url.to_string(), } } /// Run spell check on text pub async fn spell_check(&self, text: &str) -> Result> { let url = format!("{}/gc_text/fr", self.base_url); log::info!("Will use URL {}", url); let mut params = HashMap::new(); params.insert("text", text); let result = reqwest::Client::new() .post(url) .form(¶ms) .send() .await? .json::() .await?; Ok(result) } } #[cfg(test)] mod test { use crate::GrammalecteClient; #[tokio::test] async fn simple_correction() { let _ = env_logger::builder().is_test(true).try_init(); let msg = "Les ange sont inssuportables!"; let res = GrammalecteClient::default().spell_check(msg).await.unwrap(); println!("RESULT = {:#?}", res); } }