vika_cli/templates/
registry.rs

1use std::str::FromStr;
2
3/// Template identifier enum for strongly-typed template references.
4#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
5pub enum TemplateId {
6    TypeInterface,
7    TypeEnum,
8    TypeAlias,
9    ZodSchema,
10    ZodEnum,
11    ApiClientFetch,
12    ReactQueryQuery,
13    ReactQueryMutation,
14    SwrQuery,
15    SwrMutation,
16    QueryKeys,
17    RuntimeTypes,
18    RuntimeHttpClient,
19    RuntimeIndex,
20}
21
22impl TemplateId {
23    /// Returns the template filename (without extension).
24    pub fn name(self) -> &'static str {
25        match self {
26            TemplateId::TypeInterface => "type-interface",
27            TemplateId::TypeEnum => "type-enum",
28            TemplateId::TypeAlias => "type-alias",
29            TemplateId::ZodSchema => "zod-schema",
30            TemplateId::ZodEnum => "zod-enum",
31            TemplateId::ApiClientFetch => "api-client-fetch",
32            TemplateId::ReactQueryQuery => "hooks/react-query-query",
33            TemplateId::ReactQueryMutation => "hooks/react-query-mutation",
34            TemplateId::SwrQuery => "hooks/swr-query",
35            TemplateId::SwrMutation => "hooks/swr-mutation",
36            TemplateId::QueryKeys => "hooks/query-keys",
37            TemplateId::RuntimeTypes => "runtime/types",
38            TemplateId::RuntimeHttpClient => "runtime/http-client",
39            TemplateId::RuntimeIndex => "runtime/index",
40        }
41    }
42
43    /// Returns the full template filename with extension.
44    pub fn filename(self) -> String {
45        format!("{}.tera", self.name())
46    }
47
48    /// Returns all available template IDs.
49    pub fn all() -> Vec<TemplateId> {
50        vec![
51            TemplateId::TypeInterface,
52            TemplateId::TypeEnum,
53            TemplateId::TypeAlias,
54            TemplateId::ZodSchema,
55            TemplateId::ZodEnum,
56            TemplateId::ApiClientFetch,
57            TemplateId::ReactQueryQuery,
58            TemplateId::ReactQueryMutation,
59            TemplateId::SwrQuery,
60            TemplateId::SwrMutation,
61            TemplateId::QueryKeys,
62            TemplateId::RuntimeTypes,
63            TemplateId::RuntimeHttpClient,
64            TemplateId::RuntimeIndex,
65        ]
66    }
67}
68
69impl FromStr for TemplateId {
70    type Err = String;
71
72    fn from_str(s: &str) -> Result<Self, Self::Err> {
73        match s {
74            "type-interface" => Ok(TemplateId::TypeInterface),
75            "type-enum" => Ok(TemplateId::TypeEnum),
76            "type-alias" => Ok(TemplateId::TypeAlias),
77            "zod-schema" => Ok(TemplateId::ZodSchema),
78            "zod-enum" => Ok(TemplateId::ZodEnum),
79            "api-client-fetch" => Ok(TemplateId::ApiClientFetch),
80            "hooks/react-query-query" => Ok(TemplateId::ReactQueryQuery),
81            "hooks/react-query-mutation" => Ok(TemplateId::ReactQueryMutation),
82            "hooks/swr-query" => Ok(TemplateId::SwrQuery),
83            "hooks/swr-mutation" => Ok(TemplateId::SwrMutation),
84            "hooks/query-keys" => Ok(TemplateId::QueryKeys),
85            "runtime/types" => Ok(TemplateId::RuntimeTypes),
86            "runtime/http-client" => Ok(TemplateId::RuntimeHttpClient),
87            "runtime/index" => Ok(TemplateId::RuntimeIndex),
88            _ => Err(format!("Unknown template: {}", s)),
89        }
90    }
91}
92
93#[cfg(test)]
94mod tests {
95    use super::*;
96
97    #[test]
98    fn test_template_id_name() {
99        assert_eq!(TemplateId::TypeInterface.name(), "type-interface");
100        assert_eq!(TemplateId::ZodSchema.name(), "zod-schema");
101    }
102
103    #[test]
104    fn test_template_id_filename() {
105        assert_eq!(TemplateId::TypeInterface.filename(), "type-interface.tera");
106    }
107
108    #[test]
109    fn test_template_id_from_str() {
110        assert_eq!(
111            TemplateId::from_str("type-interface").unwrap(),
112            TemplateId::TypeInterface
113        );
114        assert!(TemplateId::from_str("unknown").is_err());
115    }
116
117    #[test]
118    fn test_template_id_all() {
119        let all = TemplateId::all();
120        assert_eq!(all.len(), 14);
121        assert!(all.contains(&TemplateId::TypeInterface));
122    }
123}