rmcp_openapi/
lib.rs

1pub mod error;
2pub mod http_client;
3pub mod openapi;
4pub mod server;
5pub mod tool_generator;
6pub mod tool_registry;
7
8pub use error::{OpenApiError, ToolCallError};
9pub use http_client::{HttpClient, HttpResponse};
10pub use openapi::OpenApiSpec;
11pub use openapi::OpenApiSpecLocation;
12pub use server::{OpenApiServer, ToolMetadata};
13pub use tool_generator::{ExtractedParameters, RequestConfig, ToolGenerator};
14pub use tool_registry::{ToolRegistry, ToolRegistryStats};
15
16/// Find similar strings using Jaro distance algorithm
17/// Used for parameter and tool name suggestions in errors
18pub(crate) fn find_similar_strings(unknown: &str, known_strings: &[&str]) -> Vec<String> {
19    use strsim::jaro;
20
21    let mut candidates = Vec::new();
22    for string in known_strings {
23        let confidence = jaro(unknown, string);
24        if confidence > 0.7 {
25            candidates.push((confidence, string.to_string()));
26        }
27    }
28
29    // Sort by confidence (highest first)
30    candidates.sort_by(|a, b| b.0.partial_cmp(&a.0).unwrap());
31    candidates.into_iter().map(|(_, name)| name).collect()
32}
33
34#[cfg(test)]
35mod tests {
36    use super::*;
37
38    #[test]
39    fn test_find_similar_strings() {
40        // Test basic similarity
41        let known = vec!["page_size", "user_id", "status"];
42        let suggestions = find_similar_strings("page_sixe", &known);
43        assert_eq!(suggestions, vec!["page_size"]);
44
45        // Test no suggestions for very different string
46        let suggestions = find_similar_strings("xyz123", &known);
47        assert!(suggestions.is_empty());
48
49        // Test transposed characters
50        let known = vec!["limit", "offset"];
51        let suggestions = find_similar_strings("lmiit", &known);
52        assert_eq!(suggestions, vec!["limit"]);
53
54        // Test missing character
55        let known = vec!["project_id", "merge_request_id"];
56        let suggestions = find_similar_strings("projct_id", &known);
57        assert_eq!(suggestions, vec!["project_id"]);
58
59        // Test extra character
60        let known = vec!["name", "email"];
61        let suggestions = find_similar_strings("namee", &known);
62        assert_eq!(suggestions, vec!["name"]);
63    }
64}