rmcp_openapi/
lib.rs

1pub mod error;
2pub mod http_client;
3pub mod server;
4pub mod spec;
5pub mod tool;
6pub mod tool_generator;
7pub mod tool_registry;
8
9pub use error::{CliError, Error, ToolCallError};
10pub use http_client::{HttpClient, HttpResponse};
11pub use server::Server;
12pub use spec::Spec;
13pub use spec::SpecLocation;
14pub use tool::{Tool, ToolCollection, ToolMetadata};
15pub use tool_generator::{ExtractedParameters, RequestConfig, ToolGenerator};
16pub use tool_registry::{ToolRegistry, ToolRegistryStats};
17
18/// Normalize tag strings to kebab-case for consistent filtering
19/// Converts any case format (camelCase, PascalCase, snake_case, etc.) to kebab-case
20pub fn normalize_tag(tag: &str) -> String {
21    use heck::ToKebabCase;
22    tag.to_kebab_case()
23}
24
25#[cfg(test)]
26mod tests {
27    use super::*;
28
29    #[test]
30    fn test_normalize_tag() {
31        // Test camelCase conversion
32        assert_eq!(normalize_tag("userManagement"), "user-management");
33        assert_eq!(normalize_tag("getUsers"), "get-users");
34
35        // Test PascalCase conversion
36        assert_eq!(normalize_tag("UserManagement"), "user-management");
37        assert_eq!(normalize_tag("APIKey"), "api-key");
38
39        // Test snake_case conversion
40        assert_eq!(normalize_tag("user_management"), "user-management");
41        assert_eq!(normalize_tag("get_users"), "get-users");
42
43        // Test SCREAMING_SNAKE_CASE conversion
44        assert_eq!(normalize_tag("USER_MANAGEMENT"), "user-management");
45        assert_eq!(normalize_tag("API_KEY"), "api-key");
46
47        // Test already kebab-case
48        assert_eq!(normalize_tag("user-management"), "user-management");
49        assert_eq!(normalize_tag("api-key"), "api-key");
50
51        // Test single words
52        assert_eq!(normalize_tag("users"), "users");
53        assert_eq!(normalize_tag("API"), "api");
54
55        // Test empty string
56        assert_eq!(normalize_tag(""), "");
57
58        // Test edge cases
59        assert_eq!(normalize_tag("XMLHttpRequest"), "xml-http-request");
60        assert_eq!(normalize_tag("HTTPSConnection"), "https-connection");
61
62        // Test whitespace (heck handles spaces and trimming automatically)
63        assert_eq!(normalize_tag("user management"), "user-management");
64        assert_eq!(normalize_tag(" user "), "user"); // Leading/trailing spaces are trimmed
65
66        // Test multiple separators - heck handles these well
67        assert_eq!(normalize_tag("user__management"), "user-management");
68        assert_eq!(normalize_tag("user---management"), "user-management");
69
70        // Test special characters - heck handles these
71        assert_eq!(normalize_tag("user123Management"), "user123-management");
72        assert_eq!(normalize_tag("user@management"), "user-management"); // @ gets removed
73
74        // Test numbers and mixed content
75        assert_eq!(normalize_tag("v2ApiEndpoint"), "v2-api-endpoint");
76        assert_eq!(normalize_tag("HTML5Parser"), "html5-parser");
77    }
78}