From 0d96660fcbdb6ad7f2cef60f74b09018e0386036 Mon Sep 17 00:00:00 2001 From: Ashelyn Dawn Date: Mon, 29 Jan 2024 23:45:50 -0700 Subject: config structure parsing --- src/config.rs | 95 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 95 insertions(+) create mode 100644 src/config.rs (limited to 'src/config.rs') diff --git a/src/config.rs b/src/config.rs new file mode 100644 index 0000000..998acc0 --- /dev/null +++ b/src/config.rs @@ -0,0 +1,95 @@ +use std::collections::HashMap; + +use regex::Regex; +use serde::Deserialize; + +#[derive(Deserialize)] +pub enum AutoProxyScope { + Global, + Server, + Channel +} + +#[derive(Deserialize)] +pub enum PresenceMode { + Online, + Busy, + Idle, + Invisible, +} + +#[derive(Deserialize)] +pub enum AutoproxyConfig { + Member(String), + Latch { + scope: AutoproxyLatchScope, + timeout_seconds: u32, + presence_indicator: bool + } +} + +#[derive(Deserialize)] +pub enum AutoproxyLatchScope { + Global, + Server +} + +#[derive(Deserialize)] +pub struct PluralkitConfig { + #[serde(with = "serde_regex")] + pub message_pattern: Regex, + pub api_token: String, +} + +#[derive(Deserialize)] +pub struct System { + pub reference_user_id: String, + pub members: Vec, + #[serde(default = "default_forward_pings")] + pub forward_pings: bool, + pub autoproxy: Option, + pub pluralkit: Option, +} + +fn default_forward_pings() -> bool { + false +} + +#[derive(Deserialize)] +pub struct Member { + pub name: String, + #[serde(with = "serde_regex")] + pub message_pattern: Regex, + pub discord_token: String, + pub presence: Option, + pub status: Option, +} + +#[derive(Deserialize)] +pub struct Config { + #[serde(flatten)] + pub systems: HashMap +} + +impl Config { + pub fn load(config_contents: String) -> Config { + let config : Config = toml::from_str(config_contents.as_str()).unwrap(); + + config.systems.iter().for_each(|config_system| { + let (system_name, system) = config_system; + if let Some(autoproxy) = &system.autoproxy { + if let AutoproxyConfig::Member(autoproxy_member) = autoproxy { + let member_matches = system.members.iter().all(|member| { + member.name == *autoproxy_member + }); + + if !member_matches { + panic!("System {} autoproxy member {} does not match a known member name", system_name, autoproxy_member); + } + } + } + }); + + config + } +} -- cgit 1.4.1