1use crate::transport::create_in_memory_transport;
2use rmcp::{
3 RoleClient, RoleServer, Service, serve_client, serve_server,
4 service::{ClientInitializeError, RunningService, ServerInitializeError},
5};
6
7pub async fn connect<S, C>(
10 server: S,
11 client: C,
12) -> Result<(RunningService<RoleServer, S>, RunningService<RoleClient, C>), ConnectError>
13where
14 S: Service<RoleServer>,
15 C: Service<RoleClient>,
16{
17 let (client_transport, server_transport) = create_in_memory_transport();
18
19 let (server_result, client_result) =
20 tokio::join!(serve_server(server, server_transport), serve_client(client, client_transport));
21
22 let server = server_result.map_err(ConnectError::ServerInit)?;
23 let client = client_result.map_err(ConnectError::ClientInit)?;
24
25 Ok((server, client))
26}
27
28#[derive(Debug, thiserror::Error)]
29pub enum ConnectError {
30 #[error("Server initialization failed: {0}")]
31 ServerInit(ServerInitializeError),
32 #[error("Client initialization failed: {0}")]
33 ClientInit(ClientInitializeError),
34}