use std::sync::Arc;
use async_trait::async_trait;
use tokio::sync::RwLock;
use crate::error::Error;
use crate::protocol::{
resources::{Resource, ResourceTemplate, TextResourceContents, BlobResourceContents},
prompts::{Prompt, PromptMessage},
tools::{Tool, CallToolResult},
roots::Root,
completion::CompleteResult,
logging::LoggingLevel,
};
#[derive(Debug, Clone)]
pub enum ServiceRequest {
ListResources {
cursor: Option<String>,
},
ListResourceTemplates {
cursor: Option<String>,
},
ReadResource {
uri: String,
},
SubscribeResource {
uri: String,
},
UnsubscribeResource {
uri: String,
},
ListPrompts {
cursor: Option<String>,
},
GetPrompt {
name: String,
arguments: Option<std::collections::HashMap<String, String>>,
},
ListTools {
cursor: Option<String>,
},
CallTool {
name: String,
arguments: Option<serde_json::Value>,
},
SetLoggingLevel {
level: LoggingLevel,
},
GetCompletions {
reference_type: CompletionReferenceType,
reference_name: String,
argument_name: String,
argument_value: String,
},
ListRoots,
}
#[derive(Debug, Clone)]
pub enum ServiceResponse {
ListResources {
resources: Vec<Resource>,
next_cursor: Option<String>,
},
ListResourceTemplates {
templates: Vec<ResourceTemplate>,
next_cursor: Option<String>,
},
ReadResource {
contents: Vec<ResourceContent>,
},
SubscribeResource,
UnsubscribeResource,
ListPrompts {
prompts: Vec<Prompt>,
next_cursor: Option<String>,
},
GetPrompt {
messages: Vec<PromptMessage>,
description: Option<String>,
},
ListTools {
tools: Vec<Tool>,
next_cursor: Option<String>,
},
CallTool {
result: CallToolResult,
},
SetLoggingLevel,
GetCompletions {
result: CompleteResult,
},
ListRoots {
roots: Vec<Root>,
},
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum CompletionReferenceType {
Prompt,
Resource,
}
#[derive(Debug, Clone)]
pub enum ResourceContent {
Text(TextResourceContents),
Blob(BlobResourceContents),
}
pub struct ServiceContext {
pub client_id: String,
pub initialized: bool,
pub client_info: Option<crate::protocol::Implementation>,
pub protocol_version: Option<String>,
pub capabilities: Option<super::ClientCapabilities>,
pub server_options: super::ServerOptions,
}
#[async_trait]
pub trait ServerService: Send + Sync {
async fn handle_request(
&self,
context: ServiceContext,
request: ServiceRequest,
) -> Result<ServiceResponse, Error>;
async fn client_connected(
&self,
client_id: String,
client_info: crate::protocol::Implementation,
protocol_version: String,
capabilities: super::ClientCapabilities,
) -> Result<(), Error> {
Ok(())
}
async fn client_disconnected(
&self,
client_id: String,
reason: String,
) -> Result<(), Error> {
Ok(())
}
async fn roots_updated(
&self,
client_id: String,
) -> Result<(), Error> {
Ok(())
}
}