rmcp_openapi/
lib.rs

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