use std::fmt::Debug;
use std::sync::Arc;
use async_trait::async_trait;
use tokio::sync::mpsc;
use crate::error::Result;
use crate::protocol::{ErrorMessage, Notification, Request, Response};
mod stdio;
pub use stdio::StdioTransport;
#[cfg(feature = "http")]
pub mod http;
#[cfg(feature = "http")]
pub use http::HttpTransport;
#[cfg(feature = "websocket")]
pub mod websocket;
#[cfg(feature = "websocket")]
pub use websocket::WebSocketTransport;
#[async_trait]
pub trait Transport: Send + Sync + Debug {
async fn start(&self) -> Result<()>;
fn set_request_handler(&mut self, handler: RequestHandler);
}
#[derive(Debug, Clone)]
pub enum TransportConfig {
Stdio,
#[cfg(feature = "http")]
Http { host: String, port: u16 },
#[cfg(feature = "websocket")]
WebSocket { host: String, port: u16 },
}
pub type RequestHandler =
Arc<dyn Fn(Request) -> mpsc::Sender<(Request, mpsc::Sender<TransportMessage>)> + Send + Sync>;
#[derive(Debug)]
pub enum TransportMessage {
Response(Response),
Error(ErrorMessage),
Notification(Notification),
}
pub fn create_transport(config: TransportConfig) -> Result<Box<dyn Transport>> {
match config {
TransportConfig::Stdio => {
let transport = StdioTransport::new();
Ok(Box::new(transport))
}
#[cfg(feature = "http")]
TransportConfig::Http { host, port } => {
let transport = HttpTransport::new(host, port);
Ok(Box::new(transport))
}
#[cfg(feature = "websocket")]
TransportConfig::WebSocket { host, port } => {
let transport = WebSocketTransport::new(host, port);
Ok(Box::new(transport))
}
}
}