use anyhow::Result;
use async_trait::async_trait;
use node_app_sdk_rust::{
declare_node_app, AppContext, CapabilityRequest, CapabilityResponse, NodeApp, NodeAppInfo,
ProvidedCapability,
};
use std::sync::OnceLock;
pub struct App {
state: OnceLock<()>,
}
impl App {
pub const fn new() -> Self {
Self {
state: OnceLock::new(),
}
}
}
#[async_trait]
impl NodeApp for App {
fn metadata() -> NodeAppInfo {
NodeAppInfo {
name: "{{name}}".into(),
version: env!("CARGO_PKG_VERSION").into(),
abi: "v1".into(),
}
}
fn provided_capabilities() -> Vec<ProvidedCapability> {
vec![ProvidedCapability::new("{{name}}.example.echo")
.description("Echo a string back to the caller (template default).")]
}
async fn init(&self, _ctx: &AppContext) -> Result<()> {
let _ = self.state.set(());
Ok(())
}
async fn handle_capability(&self, request: CapabilityRequest) -> Result<CapabilityResponse> {
match request.capability.as_str() {
"{{name}}.example.echo" => {
let payload = request.payload;
Ok(CapabilityResponse::ok(serde_json::json!({
"echoed": payload,
})))
}
other => Ok(CapabilityResponse::error(
"UNKNOWN_CAPABILITY",
&format!("no handler for '{}'", other),
)),
}
}
async fn shutdown(&self) -> Result<()> {
Ok(())
}
}
declare_node_app!(App);