diff --git a/src/api.rs b/src/api.rs index 0f1ff40..10c04e3 100644 --- a/src/api.rs +++ b/src/api.rs @@ -50,3 +50,4 @@ impl<'de> Deserialize<'de> for Event { deserializer.deserialize_str(EventVisitor) } } + diff --git a/src/config.rs b/src/config.rs index 3da391a..41c2977 100644 --- a/src/config.rs +++ b/src/config.rs @@ -1,14 +1,15 @@ use anyhow::{Context, Result}; use once_cell::sync::OnceCell; -use serde::Deserialize; -use std::{collections::HashMap, path::PathBuf}; +use serde::{Deserialize, de::{Deserializer, MapAccess, Visitor}}; +use std::{collections::HashMap, path::PathBuf, marker::PhantomData}; +use std::fmt; #[derive(Deserialize)] pub struct Config { pub nickname: String, pub gateways: Vec, pub api: String, - pub memes: HashMap, + pub memes: LowerCaseMap, } static CONFIG: OnceCell = OnceCell::new(); @@ -35,3 +36,36 @@ pub async fn try_get_config<'a>() -> Result<&'a Config> { Some(c) => Ok(c), } } + +pub struct LowerCaseMap { + pub map: HashMap +} + +impl<'de, T: Deserialize<'de>> Deserialize<'de> for LowerCaseMap { + fn deserialize(deserializer: D) -> Result, D::Error> + where + D: Deserializer<'de>, + { + struct LowerCaseMapVisitor(PhantomData); + + impl<'de, T: Deserialize<'de>> Visitor<'de> for LowerCaseMapVisitor { + type Value = LowerCaseMap; + + fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { + formatter.write_str("a key-value pair with a string key") + } + + fn visit_map>(self, mut access: A) -> Result { + let mut map = HashMap::new(); + while let Some((k, v)) = access.next_entry::()? { + map.insert(k.to_lowercase(), v); + } + + Ok(LowerCaseMap { map }) + } + } + + deserializer.deserialize_map(LowerCaseMapVisitor(PhantomData)) + } +} + diff --git a/src/main.rs b/src/main.rs index c70471e..49ca1d1 100644 --- a/src/main.rs +++ b/src/main.rs @@ -122,7 +122,7 @@ async fn process_message(client: &Client, message: Message) -> Result<()> { return Ok(()); } - if let Some(meme) = config.memes.get(&lower) { + if let Some(meme) = config.memes.map.get(&lower) { log::info!( r#"found meme matching message "{}". responding with "{}""#, text,