rust-sdk/examples/servers/src/common/generic_service.rs
Dale Seo be321a4abe
feat(macros): auto-generate get_info and default router (#785)
* feat(macros): auto-generate get_info and default router

* docs: simplify examples and docs with new defaults

* feat(macros): add tool_router(server_handler) to elide separate #[tool_handler] impl

* docs: add Tools section to README and simplify calculator examples with server_handler
2026-04-08 15:06:26 -04:00

73 lines
1.7 KiB
Rust

use std::sync::Arc;
use rmcp::{
ServerHandler, handler::server::wrapper::Parameters, schemars, tool, tool_handler, tool_router,
};
#[allow(dead_code)]
pub trait DataService: Send + Sync + 'static {
fn get_data(&self) -> String;
fn set_data(&mut self, data: String);
}
#[derive(Debug, Clone)]
pub struct MemoryDataService {
data: String,
}
impl MemoryDataService {
#[allow(dead_code)]
pub fn new(initial_data: impl Into<String>) -> Self {
Self {
data: initial_data.into(),
}
}
}
impl DataService for MemoryDataService {
fn get_data(&self) -> String {
self.data.clone()
}
fn set_data(&mut self, data: String) {
self.data = data;
}
}
#[derive(Debug, Clone)]
pub struct GenericService<DS: DataService> {
#[allow(dead_code)]
data_service: Arc<DS>,
}
#[derive(Debug, schemars::JsonSchema, serde::Deserialize, serde::Serialize)]
pub struct SetDataRequest {
pub data: String,
}
#[tool_router]
impl<DS: DataService> GenericService<DS> {
#[allow(dead_code)]
pub fn new(data_service: DS) -> Self {
Self {
data_service: Arc::new(data_service),
}
}
#[tool(description = "get memory from service")]
pub async fn get_data(&self) -> String {
self.data_service.get_data()
}
#[tool(description = "set memory to service")]
pub async fn set_data(
&self,
Parameters(SetDataRequest { data }): Parameters<SetDataRequest>,
) -> String {
let new_data = data.clone();
format!("Current memory: {}", new_data)
}
}
#[tool_handler(instructions = "generic data service")]
impl<DS: DataService> ServerHandler for GenericService<DS> {}