supercode-interchange 0.4.14

Canonical, provider-neutral session interchange primitives for Supercode
Documentation
//! Allowlists, admins and pairing (ยง2.4; Hermes gateway "Security & Access").

use std::collections::BTreeMap;

use schemars::JsonSchema;
use serde::{Deserialize, Serialize};

/// Per-platform policy.
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, JsonSchema, Default)]
#[serde(rename_all = "snake_case")]
pub enum AccessPolicy {
    /// Only allowlisted (or paired) senders.
    #[default]
    Allowlist,
    /// Anyone.
    Open,
}

/// A pairing code waiting for an admin.
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
pub struct PendingPairing {
    /// The platform the sender wrote on.
    pub platform: String,
    /// The sender.
    pub user_id: String,
    /// RFC3339 issue instant; expires after `pairing_ttl_minutes`.
    pub issued_at: String,
}

/// The access record (`access.yaml`).
#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
pub struct Access {
    /// Allowed senders per platform.
    #[serde(default)]
    pub allowlist: BTreeMap<String, Vec<String>>,
    /// Admins per platform.
    #[serde(default)]
    pub admins: BTreeMap<String, Vec<String>>,
    /// Outstanding pairing codes.
    #[serde(default)]
    pub pending_pairings: BTreeMap<String, PendingPairing>,
    /// Policy per platform; `allowlist` when absent.
    #[serde(default)]
    pub policy: BTreeMap<String, AccessPolicy>,
    /// Minutes a pairing code lives; `None` = the reducer's default (15).
    #[serde(default)]
    pub pairing_ttl_minutes: Option<u32>,
}