use super::create_client_info;
use crate::{ClientError, KodegenClient, KodegenConnection};
use reqwest::header::HeaderMap;
use rmcp::{
ServiceExt,
transport::{
SseClientTransport, StreamableHttpClientTransport,
streamable_http_client::StreamableHttpClientTransportConfig,
},
};
pub async fn create_http_client(
url: &str,
) -> Result<(KodegenClient, KodegenConnection), ClientError> {
let transport = SseClientTransport::start(url)
.await
.map_err(|e| ClientError::Connection {
message: format!("Failed to connect to SSE endpoint: {e}"),
transport_type: Some(crate::TransportType::Sse),
endpoint: Some(url.to_string()),
})?;
let client_info = create_client_info("kodegen-http-client");
let service = client_info
.serve(transport)
.await?;
let connection = KodegenConnection::from_service(service);
let client = connection.client();
Ok((client, connection))
}
pub async fn create_streamable_client(
url: &str,
headers: HeaderMap,
) -> Result<(KodegenClient, KodegenConnection), ClientError> {
let client = reqwest::Client::builder()
.default_headers(headers)
.build()
.map_err(|e| ClientError::Connection {
message: format!("Failed to build HTTP client: {e}"),
transport_type: Some(crate::TransportType::Http),
endpoint: Some(url.to_string()),
})?;
let config = StreamableHttpClientTransportConfig {
uri: url.into(),
..Default::default()
};
let transport = StreamableHttpClientTransport::with_client(client, config);
let client_info = create_client_info("kodegen-streamable-client");
let service = client_info
.serve(transport)
.await?;
let connection = KodegenConnection::from_service(service);
let client = connection.client();
Ok((client, connection))
}