use crate::error::Error; use j_db::database::Database; use j_db::model::JdbModel; use rand::prelude::SliceRandom; use rand::thread_rng; use serde::{Deserialize, Serialize}; #[derive(Debug, Deserialize, Serialize, Clone)] pub struct RandomConfig { id: Option, pub name: String, pub responses: Vec, } impl JdbModel for RandomConfig { fn id(&self) -> Option { self.id } fn set_id(&mut self, id: u64) { self.id = Some(id) } fn tree() -> String { "randoms".to_string() } fn check_unique(&self, _other: &Self) -> bool { true } } impl RandomConfig { pub fn add_random(db: &Database, name: &str, response: &str) -> Result<(), Error> { let mut random = match Self::get_random(db, name)? { None => db.insert::(Self { id: None, name: name.to_string(), responses: vec![], })?, Some(random) => random, }; random.responses.push(response.to_string()); db.insert::(random)?; Ok(()) } pub fn get_random(db: &Database, name: &str) -> Result, Error> { Ok(db .filter(|_, random: &RandomConfig| random.name.eq_ignore_ascii_case(name))? .next()) } pub fn get_response(&self) -> Result, Error> { Ok(self.responses.choose(&mut thread_rng())) } }