use crate::{ClientError, KodegenClient, KodegenConnection};
use rmcp::{
ServiceExt,
model::{ClientCapabilities, ClientInfo, Implementation},
transport::{SseClientTransport, StreamableHttpClientTransport},
};
pub async fn create_http_client(
url: &str,
) -> Result<(KodegenClient, KodegenConnection), ClientError> {
let transport = SseClientTransport::start(url.to_owned())
.await
.map_err(|e| ClientError::Connection(format!("Failed to connect to HTTP endpoint: {e}")))?;
let client_info = ClientInfo {
protocol_version: Default::default(),
capabilities: ClientCapabilities::default(),
client_info: Implementation {
name: "kodegen-http-client".to_string(),
title: None,
version: env!("CARGO_PKG_VERSION").to_string(),
website_url: None,
icons: None,
},
};
let service = client_info
.serve(transport)
.await
.map_err(ClientError::InitError)?;
let connection = KodegenConnection::from_service(service);
let client = connection.client();
Ok((client, connection))
}
pub async fn create_streamable_client(
url: &str,
) -> Result<(KodegenClient, KodegenConnection), ClientError> {
let transport = StreamableHttpClientTransport::from_uri(url);
let client_info = ClientInfo {
protocol_version: Default::default(),
capabilities: ClientCapabilities::default(),
client_info: Implementation {
name: "kodegen-streamable-client".to_string(),
title: None,
version: env!("CARGO_PKG_VERSION").to_string(),
website_url: None,
icons: None,
},
};
let service = client_info
.serve(transport)
.await
.map_err(ClientError::InitError)?;
let connection = KodegenConnection::from_service(service);
let client = connection.client();
Ok((client, connection))
}