rmcp_openapi/
openapi_legacy.rs

1use crate::error::OpenApiError;
2use std::env;
3use std::io;
4
5/// Legacy OpenAPI functions for backward compatibility
6/// These functions use environment variables and custom TLS setup
7pub async fn get_openapi_definition() -> Result<serde_json::Value, OpenApiError> {
8    let ca_bundle = env::var("REQUESTS_CA_BUNDLE")?;
9    let api_host = env::var("OPENAI_API_DEFINITION")?;
10
11    let client = reqwest::Client::builder()
12        .tls_built_in_root_certs(false)
13        .add_root_certificate(reqwest::Certificate::from_pem(&std::fs::read(&ca_bundle)?)?)
14        .build()?;
15
16    let response = client.get(&api_host).send().await?;
17    let text = response.text().await?;
18    let json_value: serde_json::Value = serde_json::from_str(&text)?;
19
20    Ok(json_value)
21}
22
23pub async fn get_paths_definition(
24    definition: serde_json::Value,
25    method: reqwest::Method,
26    path: &str,
27) -> Result<serde_json::Value, OpenApiError> {
28    let paths = definition
29        .get("paths")
30        .ok_or_else(|| {
31            serde_json::Error::io(io::Error::new(
32                io::ErrorKind::NotFound,
33                "paths not found in OpenAPI definition",
34            ))
35        })
36        .map_err(OpenApiError::Json)?;
37
38    let path_obj = paths
39        .get(path)
40        .ok_or_else(|| {
41            serde_json::Error::io(io::Error::new(
42                io::ErrorKind::NotFound,
43                format!("path {path} not found"),
44            ))
45        })
46        .map_err(OpenApiError::Json)?;
47
48    let method_str = method.as_str().to_lowercase();
49    let method_info = path_obj
50        .get(&method_str)
51        .ok_or_else(|| {
52            serde_json::Error::io(io::Error::new(
53                io::ErrorKind::NotFound,
54                format!("method {method_str} not found for path {path}"),
55            ))
56        })
57        .map_err(OpenApiError::Json)?;
58
59    Ok(method_info.clone())
60}