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\""));
}
}