claude_agent/common/
source_type.rs

1use serde::{Deserialize, Serialize};
2
3#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash, Serialize, Deserialize)]
4#[serde(rename_all = "lowercase")]
5pub enum SourceType {
6    Builtin,
7    #[default]
8    User,
9    Project,
10    Managed,
11}
12
13impl std::fmt::Display for SourceType {
14    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
15        match self {
16            Self::Builtin => write!(f, "builtin"),
17            Self::User => write!(f, "user"),
18            Self::Project => write!(f, "project"),
19            Self::Managed => write!(f, "managed"),
20        }
21    }
22}
23
24impl SourceType {
25    pub fn from_str_opt(s: Option<&str>) -> Self {
26        match s {
27            Some("builtin") => Self::Builtin,
28            Some("project") => Self::Project,
29            Some("managed") => Self::Managed,
30            _ => Self::User,
31        }
32    }
33}
34
35#[cfg(test)]
36mod tests {
37    use super::*;
38
39    #[test]
40    fn test_default() {
41        assert_eq!(SourceType::default(), SourceType::User);
42    }
43
44    #[test]
45    fn test_display() {
46        assert_eq!(SourceType::Builtin.to_string(), "builtin");
47        assert_eq!(SourceType::User.to_string(), "user");
48        assert_eq!(SourceType::Project.to_string(), "project");
49        assert_eq!(SourceType::Managed.to_string(), "managed");
50    }
51
52    #[test]
53    fn test_from_str_opt() {
54        assert_eq!(
55            SourceType::from_str_opt(Some("builtin")),
56            SourceType::Builtin
57        );
58        assert_eq!(
59            SourceType::from_str_opt(Some("project")),
60            SourceType::Project
61        );
62        assert_eq!(
63            SourceType::from_str_opt(Some("managed")),
64            SourceType::Managed
65        );
66        assert_eq!(SourceType::from_str_opt(Some("user")), SourceType::User);
67        assert_eq!(SourceType::from_str_opt(None), SourceType::User);
68        assert_eq!(SourceType::from_str_opt(Some("unknown")), SourceType::User);
69    }
70
71    #[test]
72    fn test_serde() {
73        let json = serde_json::to_string(&SourceType::Builtin).unwrap();
74        assert_eq!(json, "\"builtin\"");
75
76        let parsed: SourceType = serde_json::from_str("\"project\"").unwrap();
77        assert_eq!(parsed, SourceType::Project);
78    }
79}