Skip to main content

atd_protocol/
enums.rs

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    /// Hidden from `Request::ToolList` discover responses, but still
17    /// reachable by id via `Request::ToolSchema` (describe) and
18    /// `Request::RunTool` (call). Use for tools that exist for
19    /// integration tests, debugging, or advanced humans, but would add
20    /// noise to an LLM's catalog.
21    #[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}