nautalid 0.1.0

Scratch container substrate — TLS 1.3 HTTP/2+3 kernel, LID/AetherDB, optional filter bus (GPL-3.0-or-later).
//! Control-plane commands for KWT JTI replay (AetherDB).

use std::sync::Arc;

use kdl::KdlNode;

use crate::bus::{BusModule, response};
use crate::kwt_replay::JtiStore;

pub struct KwtReplayModule {
    store: Arc<JtiStore>,
}

impl KwtReplayModule {
    #[must_use]
    pub fn new(store: Arc<JtiStore>) -> Self {
        Self { store }
    }

    fn command_node<'a>(
        module_node: &'a KdlNode,
        command_nodes: &[&'a KdlNode],
    ) -> Option<&'a KdlNode> {
        if let Some(cmd) = command_nodes.first() {
            return Some(cmd);
        }
        module_node.children()?.nodes().first()
    }
}

impl BusModule for KwtReplayModule {
    fn name(&self) -> &'static str {
        "kwt-replay"
    }

    fn handle(&self, module_node: &KdlNode, command_nodes: &[&KdlNode]) -> String {
        let Some(cmd) = Self::command_node(module_node, command_nodes) else {
            return response::err("kwt-replay commands: status");
        };
        match cmd.name().value() {
            "status" => {
                let enabled = self.store.is_enabled();
                let backend = self.store.backend_label();
                let shared = self.store.is_shared();
                format!("status enabled={enabled} backend=\"{backend}\" shared={shared}")
            }
            other => response::err(&format!("unknown kwt-replay command: {other}")),
        }
    }
}

#[cfg(test)]
mod tests {
    use super::*;
    use kdl::KdlDocument;

    #[test]
    fn status_reports_disabled_backend() {
        let store = Arc::new(JtiStore::disabled());
        let doc: KdlDocument = "kwt-replay {\n    status\n}".parse().unwrap();
        let node = doc.nodes().first().unwrap();
        let body = KwtReplayModule::new(store).handle(node, &[]);
        assert!(body.contains("backend=\"disabled\""));
    }
}