Skip to main content

mur_common/bridge/
peer.rs

1use serde::{Deserialize, Serialize};
2
3/// One pubkey of a bridge (or other LLM-less peer) that this agent will accept
4/// signed envelopes from.
5///
6/// `key_version` is an optional pin: when `Some(N)`, only envelopes with
7/// `key_version == N` are accepted; when `None`, any `key_version` is accepted
8/// as long as the pubkey matches. Pins let an operator quarantine a specific
9/// rotation without removing the peer entirely.
10#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
11pub struct TrustedPeer {
12    pub pubkey_multibase: String,
13    pub name: String,
14    /// Optional version pin. None = any key_version with matching pubkey.
15    #[serde(default, skip_serializing_if = "Option::is_none")]
16    pub key_version: Option<u32>,
17}
18
19#[cfg(test)]
20mod tests {
21    use super::*;
22    #[test]
23    fn round_trip() {
24        let p = TrustedPeer {
25            pubkey_multibase: "z6Mk".into(),
26            name: "tg_bridge".into(),
27            key_version: Some(3),
28        };
29        let s = serde_yaml_ng::to_string(&p).unwrap();
30        assert_eq!(serde_yaml_ng::from_str::<TrustedPeer>(&s).unwrap(), p);
31    }
32}