naps 1.0.0

NATS server proxy service to relay and forward custom topics and subjects
Documentation
mod js;
mod lua;
mod wasm;

use std::path::Path;

use anyhow::bail;

use crate::msg::Msg;

#[derive(Debug, Clone, PartialEq)]
pub struct Output {
    pub msg: Msg,
    pub subject_set: bool,
}

pub trait Processor {
    fn process(&mut self, msg: Msg) -> anyhow::Result<Vec<Output>>;
}

pub fn new_processor(path: &Path) -> anyhow::Result<Box<dyn Processor>> {
    let ext = path.extension().and_then(|ext| ext.to_str()).unwrap_or("");
    match ext {
        "ts" | "js" => Ok(Box::new(js::JsProcessor::new(path)?)),
        "lua" => Ok(Box::new(lua::LuaProcessor::new(path)?)),
        "wasm" => Ok(Box::new(wasm::WasmProcessor::new(path)?)),
        _ => bail!("unsupported processor extension: {ext}"),
    }
}

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

    #[test]
    fn new_processor_rejects_unsupported_extension() {
        let path = Path::new("script.py");

        let err = new_processor(path).err().expect("expected an error");

        assert!(
            err.to_string()
                .contains("unsupported processor extension: py"),
            "unexpected error: {err}"
        );
    }
}