lxmf-sdk 0.7.0

High-level Rust SDK for LXMF clients and RPC-backed LXMF workflows.
Documentation
#[derive(Clone, Debug, Serialize, PartialEq)]
#[non_exhaustive]
pub struct PropagationPeerMaintenanceResult {
    #[serde(default)]
    pub timestamp: i64,
    #[serde(default)]
    pub culled: u64,
    #[serde(default)]
    pub culled_peers: Vec<String>,
    #[serde(default)]
    pub rotated: u64,
    #[serde(default)]
    pub rotated_peers: Vec<String>,
    #[serde(default)]
    pub synced_peer: Option<String>,
    #[serde(default)]
    pub peer_sync: JsonValue,
    #[serde(default)]
    pub peer_sync_state: Option<PropagationPeerSyncResult>,
    #[serde(default)]
    pub max_unreachable_secs: u64,
}

#[derive(Deserialize)]
struct RawPropagationPeerMaintenanceResult {
    #[serde(default)]
    timestamp: i64,
    #[serde(default)]
    culled: u64,
    #[serde(default)]
    culled_peers: Vec<String>,
    #[serde(default)]
    rotated: u64,
    #[serde(default)]
    rotated_peers: Vec<String>,
    #[serde(default)]
    synced_peer: Option<String>,
    #[serde(default)]
    peer_sync: JsonValue,
    #[serde(default)]
    max_unreachable_secs: u64,
}

impl<'de> Deserialize<'de> for PropagationPeerMaintenanceResult {
    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
    where
        D: serde::Deserializer<'de>,
    {
        let raw = RawPropagationPeerMaintenanceResult::deserialize(deserializer)?;
        let peer_sync_state = if raw.peer_sync.get("peer").is_some() {
            Some(
                serde_json::from_value::<PropagationPeerSyncResult>(raw.peer_sync.clone())
                    .map_err(serde::de::Error::custom)?,
            )
        } else {
            None
        };
        Ok(Self {
            timestamp: raw.timestamp,
            culled: raw.culled,
            culled_peers: raw.culled_peers,
            rotated: raw.rotated,
            rotated_peers: raw.rotated_peers,
            synced_peer: raw.synced_peer,
            peer_sync: raw.peer_sync,
            peer_sync_state,
            max_unreachable_secs: raw.max_unreachable_secs,
        })
    }
}