Skip to main content

rmcp_openapi/
lib.rs

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