1use serde::{Deserialize, Serialize};
2
3#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, Default)]
4#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
5#[serde(rename_all = "snake_case")]
6pub enum ToolVisibility {
7 #[default]
8 #[serde(alias = "Read")]
9 Read,
10 #[serde(alias = "Write")]
11 Write,
12 #[serde(alias = "Dangerous")]
13 Dangerous,
14 #[serde(alias = "System")]
15 System,
16 #[serde(alias = "Hidden")]
22 Hidden,
23}
24
25#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Serialize, Deserialize)]
26#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
27#[serde(rename_all = "snake_case")]
28pub enum ToolTier {
29 #[serde(alias = "Hot")]
30 Hot,
31 #[serde(alias = "Warm")]
32 Warm,
33 #[serde(alias = "Cold")]
34 Cold,
35}
36
37#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
38#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
39#[serde(rename_all = "PascalCase")]
40pub enum BindingProtocol {
41 Cli,
42 Mcp,
43 AppFunction,
44 Rest,
45}
46
47#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Serialize, Deserialize)]
48#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
49pub enum SafetyLevel {
50 Read = 0,
51 Write = 1,
52 Financial = 2,
53 Privacy = 3,
54 Physical = 4,
55 Destructive = 5,
56}
57
58#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Serialize, Deserialize)]
59#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
60pub enum TrustLevel {
61 L0Unverified = 0,
62 L1SchemaValid = 1,
63 L2Tested = 2,
64 L3Verified = 3,
65 L4Certified = 4,
66}
67
68#[cfg(test)]
69mod tests {
70 use super::*;
71
72 #[test]
73 fn visibility_serializes_snake_case() {
74 assert_eq!(
75 serde_json::to_string(&ToolVisibility::Dangerous).unwrap(),
76 "\"dangerous\""
77 );
78 }
79
80 #[test]
81 fn visibility_default_is_read() {
82 assert_eq!(ToolVisibility::default(), ToolVisibility::Read);
83 }
84
85 #[test]
86 fn visibility_hidden_serializes_snake_case() {
87 assert_eq!(
88 serde_json::to_string(&ToolVisibility::Hidden).unwrap(),
89 "\"hidden\""
90 );
91 }
92
93 #[test]
94 fn visibility_hidden_round_trips() {
95 let parsed: ToolVisibility = serde_json::from_str("\"hidden\"").unwrap();
96 assert_eq!(parsed, ToolVisibility::Hidden);
97 }
98
99 #[test]
100 fn tier_ordering_is_hot_warm_cold() {
101 assert!(ToolTier::Hot < ToolTier::Warm);
102 assert!(ToolTier::Warm < ToolTier::Cold);
103 }
104
105 #[test]
106 fn binding_protocol_pascal_case() {
107 assert_eq!(
108 serde_json::to_string(&BindingProtocol::AppFunction).unwrap(),
109 "\"AppFunction\""
110 );
111 }
112
113 #[test]
114 fn safety_level_ord() {
115 assert!(SafetyLevel::Read < SafetyLevel::Destructive);
116 }
117
118 #[test]
119 fn trust_level_ord() {
120 assert!(TrustLevel::L0Unverified < TrustLevel::L4Certified);
121 }
122}