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 #[serde(default)]
26 pub allowed_user_ids: Vec<String>,
27}
28
29#[derive(Debug, Clone, Serialize, Deserialize, Default, PartialEq, Eq)]
30#[serde(rename_all = "snake_case")]
31pub enum SlackPrivacyMode {
32 DmOnly,
34 #[default]
36 DmAndMentions,
37}
38
39#[cfg(test)]
40mod tests {
41 use super::*;
42
43 #[test]
44 fn round_trips_yaml() {
45 let yaml = r#"
46workspace_url: "https://myteam.slack.com"
47bot_token_keychain_account: "mur_slack_bot_myagent"
48app_token_keychain_account: "mur_slack_app_myagent"
49"#;
50 let cfg: SlackConfig = serde_yaml::from_str(yaml).unwrap();
51 assert_eq!(cfg.privacy_mode, SlackPrivacyMode::DmAndMentions);
52 assert!(cfg.allowed_channels.is_empty());
53 }
54
55 #[test]
56 fn dm_only_mode_round_trips() {
57 let yaml = r#"
58workspace_url: "https://myteam.slack.com"
59bot_token_keychain_account: "mur_slack_bot_x"
60app_token_keychain_account: "mur_slack_app_x"
61privacy_mode: dm_only
62"#;
63 let cfg: SlackConfig = serde_yaml::from_str(yaml).unwrap();
64 assert_eq!(cfg.privacy_mode, SlackPrivacyMode::DmOnly);
65 }
66
67 #[test]
68 fn allowed_channels_round_trips() {
69 let yaml = r#"
70workspace_url: "https://myteam.slack.com"
71bot_token_keychain_account: "mur_slack_bot_x"
72app_token_keychain_account: "mur_slack_app_x"
73allowed_channels: ["C111", "C222"]
74"#;
75 let cfg: SlackConfig = serde_yaml::from_str(yaml).unwrap();
76 assert_eq!(cfg.allowed_channels, vec!["C111", "C222"]);
77 }
78}