1use domain::error::{CodeGraphError, Result};
2use domain::model::*;
3
4pub(crate) fn map_rusqlite_error(e: rusqlite::Error) -> CodeGraphError {
5 CodeGraphError::Storage(e.to_string())
6}
7
8pub(crate) fn language_to_str(l: &Language) -> &'static str {
13 match l {
14 Language::TypeScript => "TypeScript",
15 Language::JavaScript => "JavaScript",
16 Language::Rust => "Rust",
17 Language::Python => "Python",
18 Language::Go => "Go",
19 }
20}
21
22pub(crate) fn language_from_str(s: &str) -> Result<Language> {
23 match s {
24 "TypeScript" => Ok(Language::TypeScript),
25 "JavaScript" => Ok(Language::JavaScript),
26 "Rust" => Ok(Language::Rust),
27 "Python" => Ok(Language::Python),
28 "Go" => Ok(Language::Go),
29 _ => Err(CodeGraphError::Storage(format!("unknown language: {s}"))),
30 }
31}
32
33pub(crate) fn symbol_kind_to_str(k: &SymbolKind) -> &'static str {
38 match k {
39 SymbolKind::Function => "function",
40 SymbolKind::Class => "class",
41 SymbolKind::Interface => "interface",
42 SymbolKind::Struct => "struct",
43 SymbolKind::Trait => "trait",
44 SymbolKind::Enum => "enum",
45 SymbolKind::TypeAlias => "type_alias",
46 SymbolKind::Method => "method",
47 SymbolKind::Property => "property",
48 SymbolKind::Const => "const",
49 SymbolKind::Macro => "macro",
50 SymbolKind::Variable => "variable",
51 SymbolKind::Component => "component",
52 SymbolKind::Test => "test",
53 }
54}
55
56pub(crate) fn symbol_kind_from_str(s: &str) -> Result<SymbolKind> {
57 match s {
58 "function" => Ok(SymbolKind::Function),
59 "class" => Ok(SymbolKind::Class),
60 "interface" => Ok(SymbolKind::Interface),
61 "struct" => Ok(SymbolKind::Struct),
62 "trait" => Ok(SymbolKind::Trait),
63 "enum" => Ok(SymbolKind::Enum),
64 "type_alias" => Ok(SymbolKind::TypeAlias),
65 "method" => Ok(SymbolKind::Method),
66 "property" => Ok(SymbolKind::Property),
67 "const" => Ok(SymbolKind::Const),
68 "macro" => Ok(SymbolKind::Macro),
69 "variable" => Ok(SymbolKind::Variable),
70 "component" => Ok(SymbolKind::Component),
71 "test" => Ok(SymbolKind::Test),
72 _ => Err(CodeGraphError::Storage(format!("unknown symbol kind: {s}"))),
73 }
74}
75
76pub(crate) fn edge_kind_to_str(k: &EdgeKind) -> &'static str {
81 match k {
82 EdgeKind::Contains => "contains",
83 EdgeKind::ChildOf => "child_of",
84 EdgeKind::Calls => "calls",
85 EdgeKind::ImportsFrom => "imports_from",
86 EdgeKind::Extends => "extends",
87 EdgeKind::Implements => "implements",
88 EdgeKind::TestedBy => "tested_by",
89 EdgeKind::DependsOn => "depends_on",
90 EdgeKind::BarrelReExportAll => "barrel_re_export_all",
91 EdgeKind::ConditionalImport => "conditional_import",
92 EdgeKind::SideEffectImport => "side_effect_import",
93 EdgeKind::DotImport => "dot_import",
94 EdgeKind::HasDecorator => "has_decorator",
95 EdgeKind::Embeds => "embeds",
96 EdgeKind::TypeReference => "type_reference",
97 EdgeKind::ReExport => "re_export",
98 }
99}
100
101pub(crate) fn edge_kind_from_str(s: &str) -> Result<EdgeKind> {
102 match s {
103 "contains" => Ok(EdgeKind::Contains),
104 "child_of" => Ok(EdgeKind::ChildOf),
105 "calls" => Ok(EdgeKind::Calls),
106 "imports_from" => Ok(EdgeKind::ImportsFrom),
107 "extends" => Ok(EdgeKind::Extends),
108 "implements" => Ok(EdgeKind::Implements),
109 "tested_by" => Ok(EdgeKind::TestedBy),
110 "depends_on" => Ok(EdgeKind::DependsOn),
111 "barrel_re_export_all" => Ok(EdgeKind::BarrelReExportAll),
112 "conditional_import" => Ok(EdgeKind::ConditionalImport),
113 "side_effect_import" => Ok(EdgeKind::SideEffectImport),
114 "dot_import" => Ok(EdgeKind::DotImport),
115 "has_decorator" => Ok(EdgeKind::HasDecorator),
116 "embeds" => Ok(EdgeKind::Embeds),
117 "type_reference" => Ok(EdgeKind::TypeReference),
118 "re_export" => Ok(EdgeKind::ReExport),
119 _ => Err(CodeGraphError::Storage(format!("unknown edge kind: {s}"))),
120 }
121}
122
123pub(crate) fn visibility_to_str(v: &Visibility) -> &'static str {
128 match v {
129 Visibility::Public => "public",
130 Visibility::Private => "private",
131 Visibility::Crate => "crate",
132 }
133}
134
135pub(crate) fn visibility_from_str(s: &str) -> Result<Visibility> {
136 match s {
137 "public" => Ok(Visibility::Public),
138 "private" => Ok(Visibility::Private),
139 "crate" => Ok(Visibility::Crate),
140 _ => Err(CodeGraphError::Storage(format!("unknown visibility: {s}"))),
141 }
142}
143
144#[allow(dead_code)]
149pub(crate) fn non_parsed_kind_to_str(k: &NonParsedKind) -> &'static str {
150 match k {
151 NonParsedKind::Doc => "doc",
152 NonParsedKind::Config => "config",
153 NonParsedKind::CI => "ci",
154 NonParsedKind::Asset => "asset",
155 NonParsedKind::Other => "other",
156 }
157}
158
159#[allow(dead_code)]
160pub(crate) fn non_parsed_kind_from_str(s: &str) -> Result<NonParsedKind> {
161 match s {
162 "doc" => Ok(NonParsedKind::Doc),
163 "config" => Ok(NonParsedKind::Config),
164 "ci" => Ok(NonParsedKind::CI),
165 "asset" => Ok(NonParsedKind::Asset),
166 "other" => Ok(NonParsedKind::Other),
167 _ => Err(CodeGraphError::Storage(format!(
168 "unknown non-parsed kind: {s}"
169 ))),
170 }
171}
172
173#[cfg(test)]
174mod tests {
175 use super::*;
176
177 #[test]
178 fn language_roundtrip_all_variants() {
179 let variants = [
180 Language::TypeScript,
181 Language::JavaScript,
182 Language::Rust,
183 Language::Python,
184 Language::Go,
185 ];
186 for v in &variants {
187 let s = language_to_str(v);
188 let back = language_from_str(s).unwrap();
189 assert_eq!(*v, back, "roundtrip failed for {s}");
190 }
191 }
192
193 #[test]
194 fn symbol_kind_roundtrip_all_variants() {
195 let variants = [
196 SymbolKind::Function,
197 SymbolKind::Class,
198 SymbolKind::Interface,
199 SymbolKind::Struct,
200 SymbolKind::Trait,
201 SymbolKind::Enum,
202 SymbolKind::TypeAlias,
203 SymbolKind::Method,
204 SymbolKind::Property,
205 SymbolKind::Const,
206 SymbolKind::Macro,
207 SymbolKind::Variable,
208 SymbolKind::Component,
209 SymbolKind::Test,
210 ];
211 for v in &variants {
212 let s = symbol_kind_to_str(v);
213 let back = symbol_kind_from_str(s).unwrap();
214 assert_eq!(*v, back, "roundtrip failed for {s}");
215 }
216 }
217
218 #[test]
219 fn edge_kind_roundtrip_all_16_variants() {
220 let variants = [
221 EdgeKind::Contains,
222 EdgeKind::ChildOf,
223 EdgeKind::Calls,
224 EdgeKind::ImportsFrom,
225 EdgeKind::Extends,
226 EdgeKind::Implements,
227 EdgeKind::TestedBy,
228 EdgeKind::DependsOn,
229 EdgeKind::BarrelReExportAll,
230 EdgeKind::ConditionalImport,
231 EdgeKind::SideEffectImport,
232 EdgeKind::DotImport,
233 EdgeKind::HasDecorator,
234 EdgeKind::Embeds,
235 EdgeKind::TypeReference,
236 EdgeKind::ReExport,
237 ];
238 assert_eq!(variants.len(), 16);
239 for v in &variants {
240 let s = edge_kind_to_str(v);
241 let back = edge_kind_from_str(s).unwrap();
242 assert_eq!(*v, back, "roundtrip failed for {s}");
243 }
244 }
245
246 #[test]
247 fn visibility_roundtrip_all_variants() {
248 for v in &[Visibility::Public, Visibility::Private, Visibility::Crate] {
249 let s = visibility_to_str(v);
250 let back = visibility_from_str(s).unwrap();
251 assert_eq!(*v, back);
252 }
253 }
254
255 #[test]
256 fn non_parsed_kind_roundtrip_all_variants() {
257 let variants = [
258 NonParsedKind::Doc,
259 NonParsedKind::Config,
260 NonParsedKind::CI,
261 NonParsedKind::Asset,
262 NonParsedKind::Other,
263 ];
264 for v in &variants {
265 let s = non_parsed_kind_to_str(v);
266 let back = non_parsed_kind_from_str(s).unwrap();
267 assert_eq!(*v, back);
268 }
269 }
270
271 #[test]
272 fn unknown_string_returns_storage_error() {
273 assert!(language_from_str("Haskell").is_err());
274 assert!(symbol_kind_from_str("Widget").is_err());
275 assert!(edge_kind_from_str("MagicLink").is_err());
276 assert!(visibility_from_str("Protected").is_err());
277 assert!(non_parsed_kind_from_str("Unknown").is_err());
278 }
279}