use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TelegramConfigFile {
pub bot_token: String,
#[serde(default = "default_allow_all")]
pub allowed_users: Vec<String>,
#[serde(default)]
pub mention_only: bool,
#[serde(default)]
pub style_profile: tandem_channels::config::TelegramStyleProfile,
#[serde(default)]
pub security_profile: tandem_channels::config::ChannelSecurityProfile,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct DiscordConfigFile {
pub bot_token: String,
#[serde(default)]
pub guild_id: Option<String>,
#[serde(default = "default_allow_all")]
pub allowed_users: Vec<String>,
#[serde(default = "default_discord_mention_only")]
pub mention_only: bool,
#[serde(default)]
pub security_profile: tandem_channels::config::ChannelSecurityProfile,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SlackConfigFile {
pub bot_token: String,
pub channel_id: String,
#[serde(default = "default_allow_all")]
pub allowed_users: Vec<String>,
#[serde(default)]
pub mention_only: bool,
#[serde(default)]
pub security_profile: tandem_channels::config::ChannelSecurityProfile,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct ChannelsConfigFile {
pub telegram: Option<TelegramConfigFile>,
pub discord: Option<DiscordConfigFile>,
pub slack: Option<SlackConfigFile>,
#[serde(default)]
pub tool_policy: tandem_channels::config::ChannelToolPolicy,
}
pub fn normalize_allowed_users_or_wildcard(raw: Vec<String>) -> Vec<String> {
let normalized = normalize_non_empty_list(raw);
if normalized.is_empty() {
return default_allow_all();
}
normalized
}
pub fn normalize_allowed_tools(raw: Vec<String>) -> Vec<String> {
normalize_non_empty_list(raw)
}
fn default_allow_all() -> Vec<String> {
vec!["*".to_string()]
}
fn default_discord_mention_only() -> bool {
true
}
fn normalize_non_empty_list(raw: Vec<String>) -> Vec<String> {
let mut out = Vec::new();
let mut seen = std::collections::HashSet::new();
for item in raw {
let normalized = item.trim().to_string();
if normalized.is_empty() {
continue;
}
if seen.insert(normalized.clone()) {
out.push(normalized);
}
}
out
}