use std::collections::HashMap;
use crate::protocol::Implementation;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum OperationalState {
Stopped,
Starting,
Running,
Stopping,
}
pub(crate) struct ServerState {
operational_state: OperationalState,
}
#[derive(Debug, Clone)]
pub(crate) struct CapabilityState {
pub logging: bool,
pub sampling: bool,
pub roots: bool,
pub roots_list_changed: bool,
pub prompts_list_changed: bool,
pub resources_list_changed: bool,
pub resources_subscribe: bool,
pub tools_list_changed: bool,
pub experimental: HashMap<String, serde_json::Value>,
}
impl Default for CapabilityState {
fn default() -> Self {
Self {
logging: false,
sampling: false,
roots: false,
roots_list_changed: false,
prompts_list_changed: false,
resources_list_changed: false,
resources_subscribe: false,
tools_list_changed: false,
experimental: HashMap::new(),
}
}
}
#[derive(Debug)]
pub(crate) struct Connection {
pub id: String,
pub initialized: bool,
pub client_info: Option<Implementation>,
pub protocol_version: Option<String>,
pub capabilities: CapabilityState,
pub subscribed_resources: Vec<String>,
}
impl Connection {
pub fn new(id: &str) -> Self {
Self {
id: id.to_string(),
initialized: false,
client_info: None,
protocol_version: None,
capabilities: CapabilityState::default(),
subscribed_resources: Vec::new(),
}
}
pub fn set_initialized(
&mut self,
client_info: Implementation,
protocol_version: String,
capabilities: CapabilityState,
) {
self.initialized = true;
self.client_info = Some(client_info);
self.protocol_version = Some(protocol_version);
self.capabilities = capabilities;
}
pub fn subscribe_resource(&mut self, uri: &str) {
if !self.subscribed_resources.contains(&uri.to_string()) {
self.subscribed_resources.push(uri.to_string());
}
}
pub fn unsubscribe_resource(&mut self, uri: &str) {
self.subscribed_resources.retain(|r| r != uri);
}
pub fn is_subscribed_to(&self, uri: &str) -> bool {
self.subscribed_resources.contains(&uri.to_string())
}
}
impl ServerState {
pub fn new() -> Self {
Self {
operational_state: OperationalState::Stopped,
}
}
pub fn operational_state(&self) -> OperationalState {
self.operational_state
}
pub fn set_starting(&mut self) {
self.operational_state = OperationalState::Starting;
}
pub fn set_running(&mut self) {
self.operational_state = OperationalState::Running;
}
pub fn set_stopping(&mut self) {
self.operational_state = OperationalState::Stopping;
}
pub fn set_stopped(&mut self) {
self.operational_state = OperationalState::Stopped;
}
pub fn is_stopped(&self) -> bool {
self.operational_state == OperationalState::Stopped
}
pub fn is_starting(&self) -> bool {
self.operational_state == OperationalState::Starting
}
pub fn is_running(&self) -> bool {
self.operational_state == OperationalState::Running
}
pub fn is_stopping(&self) -> bool {
self.operational_state == OperationalState::Stopping
}
}
impl Default for ServerState {
fn default() -> Self {
Self::new()
}
}