use trusty_mcp_core::ServiceDescriptor;
use crate::openrpc::scopes_for_tool;
use crate::tools::tool_definitions_with;
#[derive(Debug, Default, Clone, Copy)]
pub struct MemoryMcpService;
impl ServiceDescriptor for MemoryMcpService {
fn name(&self) -> &str {
"trusty-memory"
}
fn version(&self) -> &str {
env!("CARGO_PKG_VERSION")
}
fn tools(&self) -> Vec<serde_json::Value> {
let defs = tool_definitions_with(false);
defs.get("tools")
.and_then(|v| v.as_array())
.cloned()
.unwrap_or_default()
}
fn scopes_for(&self, tool: &str) -> Vec<String> {
scopes_for_tool(tool)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn name_returns_trusty_memory() {
let svc = MemoryMcpService;
assert_eq!(svc.name(), "trusty-memory");
}
#[test]
fn version_matches_cargo_pkg_version() {
let svc = MemoryMcpService;
assert_eq!(svc.version(), env!("CARGO_PKG_VERSION"));
}
#[test]
fn tools_returns_eleven() {
let svc = MemoryMcpService;
let tools = svc.tools();
assert_eq!(
tools.len(),
12,
"expected 12 memory tools, got {}",
tools.len()
);
}
#[test]
fn scopes_for_read_tool() {
let svc = MemoryMcpService;
assert_eq!(svc.scopes_for("memory_recall"), vec!["memory.read"]);
}
#[test]
fn scopes_for_write_tool() {
let svc = MemoryMcpService;
assert_eq!(svc.scopes_for("memory_remember"), vec!["memory.write"]);
}
#[test]
fn dispatches_through_trait_object() {
let svc: Box<dyn ServiceDescriptor> = Box::new(MemoryMcpService);
assert_eq!(svc.name(), "trusty-memory");
assert_eq!(svc.tools().len(), 12);
assert_eq!(svc.scopes_for("palace_create"), vec!["memory.write"]);
assert_eq!(svc.scopes_for("palace_list"), vec!["memory.read"]);
}
}