prns-runtime 0.3.4

Runtime-neutral Personal Reticulum node contracts and manifold kernel
Documentation
use alloc::string::String;
use alloc::vec::Vec;

use prns_core::interfaces::rns_management::{
    RnsAnnounceRateEntry, RnsAnnounceRateTable, RnsInterfaceAccessCode, RnsInterfaceStats,
    RnsInterfaceStatsEntry,
};

use super::node_introspection::{
    logical_interface_inventory, AnnounceRateSnapshot, InterfaceInventoryEntry,
};

pub fn interface_stats(inventory: Vec<InterfaceInventoryEntry<String>>) -> RnsInterfaceStats {
    RnsInterfaceStats::new(
        logical_interface_inventory(inventory)
            .into_iter()
            .map(|entry| {
                let access_code = entry.ifac.map(|access_code| {
                    RnsInterfaceAccessCode::new(
                        access_code.signature,
                        access_code.size,
                        access_code.network_name,
                    )
                });
                RnsInterfaceStatsEntry::new(entry.name, entry.snapshot, access_code)
            })
            .collect(),
    )
}

pub fn announce_rate_table(entries: Vec<AnnounceRateSnapshot>) -> RnsAnnounceRateTable {
    RnsAnnounceRateTable::new(
        entries
            .into_iter()
            .map(|entry| {
                RnsAnnounceRateEntry::new(
                    entry.destination,
                    entry.last_allowed_announce_at,
                    entry.blocked_until,
                    entry.rate_violations,
                    entry.observed_at,
                )
            })
            .collect(),
    )
}