mur_common/bridge/
slack_config.rs1use serde::{Deserialize, Serialize};
4
5#[derive(Debug, Clone, Serialize, Deserialize)]
9pub struct SlackConfig {
10 pub workspace_url: String,
12 pub bot_token_keychain_account: String,
14 pub app_token_keychain_account: String,
16 #[serde(default)]
18 pub privacy_mode: SlackPrivacyMode,
19 #[serde(default)]
21 pub allowed_channels: Vec<String>,
22}
23
24#[derive(Debug, Clone, Serialize, Deserialize, Default, PartialEq, Eq)]
25#[serde(rename_all = "snake_case")]
26pub enum SlackPrivacyMode {
27 DmOnly,
29 #[default]
31 DmAndMentions,
32}
33
34#[cfg(test)]
35mod tests {
36 use super::*;
37
38 #[test]
39 fn round_trips_yaml() {
40 let yaml = r#"
41workspace_url: "https://myteam.slack.com"
42bot_token_keychain_account: "mur_slack_bot_myagent"
43app_token_keychain_account: "mur_slack_app_myagent"
44"#;
45 let cfg: SlackConfig = serde_yaml::from_str(yaml).unwrap();
46 assert_eq!(cfg.privacy_mode, SlackPrivacyMode::DmAndMentions);
47 assert!(cfg.allowed_channels.is_empty());
48 }
49
50 #[test]
51 fn dm_only_mode_round_trips() {
52 let yaml = r#"
53workspace_url: "https://myteam.slack.com"
54bot_token_keychain_account: "mur_slack_bot_x"
55app_token_keychain_account: "mur_slack_app_x"
56privacy_mode: dm_only
57"#;
58 let cfg: SlackConfig = serde_yaml::from_str(yaml).unwrap();
59 assert_eq!(cfg.privacy_mode, SlackPrivacyMode::DmOnly);
60 }
61
62 #[test]
63 fn allowed_channels_round_trips() {
64 let yaml = r#"
65workspace_url: "https://myteam.slack.com"
66bot_token_keychain_account: "mur_slack_bot_x"
67app_token_keychain_account: "mur_slack_app_x"
68allowed_channels: ["C111", "C222"]
69"#;
70 let cfg: SlackConfig = serde_yaml::from_str(yaml).unwrap();
71 assert_eq!(cfg.allowed_channels, vec!["C111", "C222"]);
72 }
73}