prns-config 0.3.4

Config discovery, parsing, and reconciliation for the Personal Reticulum daemon
Documentation
use std::time::Duration;

use super::interface::RNS_DEFAULT_SERIAL_BAUD;
use super::*;
use crate::reference::keys::interface as interface_key;
use crate::reference::parse;
use crate::ConfigDiagnosticCode;
use prns_core::interface_discovery::{InterfaceDiscoveryPolicy, DEFAULT_STAMP_COST};
use prns_core::interfaces::tcp::TcpWireFraming;
use prns_core::interfaces::IfacSize;
use prns_core::interfaces::{
    AnnounceBandwidthCap, AnnounceRateLimit, BitrateBps, EgressCapability, IngressCapability,
    InterfaceGravity, InterfaceMode,
};
use prns_core::units::DurationMillis;

fn plan_of(config: &str) -> DaemonPlan {
    parse_and_plan(config).expect("config plans").value
}

fn named<'a>(plan: &'a DaemonPlan, name: &str) -> &'a PlannedInterface {
    plan.interfaces
        .iter()
        .find(|interface| interface.name == name)
        .unwrap_or_else(|| panic!("interface '{name}' was planned"))
}

fn tcp_dial(host: &str, port: u16) -> TcpDialPlan {
    TcpDialPlan {
        host: host.to_string(),
        port,
        connect_timeout: ConnectTimeoutSeconds::new(5),
        reconnect_limit: ReconnectLimit::Unlimited,
        address_family: AddressFamilyPreference::System,
        tunnel: TcpTunnelMode::Direct,
    }
}

fn tcp_listener(host: TcpListenHost, port: u16) -> TcpListenPlan {
    TcpListenPlan {
        host,
        port,
        address_family: AddressFamilyPreference::Ipv4,
        tunnel: TcpTunnelMode::Direct,
    }
}

fn udp_address(host: &str, port: u16) -> UdpEndpointPlan {
    UdpEndpointPlan {
        host: UdpEndpointHost::Address(host.to_string()),
        port,
    }
}

fn serial_line_plan(baud: u32) -> SerialLinePlan {
    SerialLinePlan {
        baud,
        data_bits: SerialDataBits::Eight,
        parity: SerialParity::None,
        stop_bits: SerialStopBits::One,
    }
}

const STOCK: &str = "[reticulum]\n\
        enable_transport = Yes\n\
        share_instance = Yes\n\
        [interfaces]\n\
          [[Default Interface]]\n\
            type = AutoInterface\n\
            interface_enabled = Yes\n\
          [[Hub]]\n\
            type = TCPClientInterface\n\
            interface_enabled = Yes\n\
            target_host = hub.example.com\n\
            target_port = 4965\n\
          [[Listener]]\n\
            type = TCPServerInterface\n\
            interface_enabled = Yes\n\
            listen_ip = 0.0.0.0\n\
            listen_port = 4242\n\
          [[Mesh]]\n\
            type = UDPInterface\n\
            interface_enabled = Yes\n\
            listen_ip = 0.0.0.0\n\
            listen_port = 4848\n\
            forward_ip = 255.255.255.255\n\
            forward_port = 4848\n\
          [[Modem]]\n\
            type = SerialInterface\n\
            interface_enabled = Yes\n\
            port = /dev/ttyUSB0\n\
            speed = 115200\n";

mod discovery;
mod medium;
mod node;
mod policy;