rmcp_openapi/
openapi_legacy.rs1use crate::error::OpenApiError;
2use std::env;
3use std::io;
4
5pub 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}