use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq)]
#[serde(default)]
pub struct ChannelsListFilter {
#[serde(skip_serializing_if = "Option::is_none")]
pub agent_id: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct ChannelEntry {
pub agent_id: String,
pub server_name: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub allowlist: Option<Vec<usize>>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq)]
pub struct ChannelsListResponse {
pub entries: Vec<ChannelEntry>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct ChannelsApproveInput {
pub agent_id: String,
pub server_name: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub allowlist: Option<Vec<usize>>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct ChannelsRevokeParams {
pub agent_id: String,
pub server_name: String,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq)]
pub struct ChannelsRevokeResponse {
pub removed: bool,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq)]
#[serde(default)]
pub struct ChannelsDoctorParams {
#[serde(skip_serializing_if = "Option::is_none")]
pub agent_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub binding_index: Option<usize>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct ChannelDoctorVerdict {
pub agent_id: String,
pub server_name: String,
pub status: String,
pub message: String,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq)]
pub struct ChannelDoctorReport {
pub verdicts: Vec<ChannelDoctorVerdict>,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn channel_entry_round_trip() {
let e = ChannelEntry {
agent_id: "ana".into(),
server_name: "plugin:telegram:tg".into(),
allowlist: Some(vec![0, 1]),
};
let v = serde_json::to_value(&e).unwrap();
let back: ChannelEntry = serde_json::from_value(v).unwrap();
assert_eq!(e, back);
}
#[test]
fn channel_entry_skips_none_allowlist() {
let e = ChannelEntry {
agent_id: "ana".into(),
server_name: "slack".into(),
allowlist: None,
};
let v = serde_json::to_value(&e).unwrap();
let obj = v.as_object().unwrap();
assert!(!obj.contains_key("allowlist"));
}
}