use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SlackConfig {
pub workspace_url: String,
pub bot_token_keychain_account: String,
pub app_token_keychain_account: String,
#[serde(default)]
pub privacy_mode: SlackPrivacyMode,
#[serde(default)]
pub allowed_channels: Vec<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default, PartialEq, Eq)]
#[serde(rename_all = "snake_case")]
pub enum SlackPrivacyMode {
DmOnly,
#[default]
DmAndMentions,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn round_trips_yaml() {
let yaml = r#"
workspace_url: "https://myteam.slack.com"
bot_token_keychain_account: "mur_slack_bot_myagent"
app_token_keychain_account: "mur_slack_app_myagent"
"#;
let cfg: SlackConfig = serde_yaml::from_str(yaml).unwrap();
assert_eq!(cfg.privacy_mode, SlackPrivacyMode::DmAndMentions);
assert!(cfg.allowed_channels.is_empty());
}
#[test]
fn dm_only_mode_round_trips() {
let yaml = r#"
workspace_url: "https://myteam.slack.com"
bot_token_keychain_account: "mur_slack_bot_x"
app_token_keychain_account: "mur_slack_app_x"
privacy_mode: dm_only
"#;
let cfg: SlackConfig = serde_yaml::from_str(yaml).unwrap();
assert_eq!(cfg.privacy_mode, SlackPrivacyMode::DmOnly);
}
#[test]
fn allowed_channels_round_trips() {
let yaml = r#"
workspace_url: "https://myteam.slack.com"
bot_token_keychain_account: "mur_slack_bot_x"
app_token_keychain_account: "mur_slack_app_x"
allowed_channels: ["C111", "C222"]
"#;
let cfg: SlackConfig = serde_yaml::from_str(yaml).unwrap();
assert_eq!(cfg.allowed_channels, vec!["C111", "C222"]);
}
}