1#[derive(Debug, Clone, PartialEq, Eq, Hash)]
3pub enum Tier {
4 Atom,
6 Molecule,
8 Layout,
10 Feature,
12 Knowledge,
14 Unknown,
16}
17
18impl Tier {
19 pub fn from_path(path: &str) -> Self {
21 let p = path.replace('\\', "/");
22 if p.starts_with("atoms/") || p.contains("/atoms/") {
23 Tier::Atom
24 } else if p.starts_with("molecules/") || p.contains("/molecules/") {
25 Tier::Molecule
26 } else if p.starts_with("layouts/") || p.contains("/layouts/") {
27 Tier::Layout
28 } else if p.starts_with("features/") || p.contains("/features/") {
29 Tier::Feature
30 } else if p.ends_with(".md") {
31 Tier::Knowledge
32 } else {
33 Tier::Unknown
34 }
35 }
36}
37
38impl std::fmt::Display for Tier {
39 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
40 match self {
41 Tier::Atom => write!(f, "atom"),
42 Tier::Molecule => write!(f, "molecule"),
43 Tier::Layout => write!(f, "layout"),
44 Tier::Feature => write!(f, "feature"),
45 Tier::Knowledge => write!(f, "knowledge"),
46 Tier::Unknown => write!(f, "unknown"),
47 }
48 }
49}
50
51#[cfg(test)]
52mod tests {
53 use super::*;
54
55 #[test]
56 fn infers_atom_from_path() {
57 assert_eq!(Tier::from_path("atoms/drizzle/column.jinja"), Tier::Atom);
58 assert_eq!(Tier::from_path("templates/atoms/zod/field.jinja"), Tier::Atom);
59 }
60
61 #[test]
62 fn infers_molecule_from_path() {
63 assert_eq!(Tier::from_path("molecules/drizzle/table_body.jinja"), Tier::Molecule);
64 }
65
66 #[test]
67 fn infers_layout_from_path() {
68 assert_eq!(Tier::from_path("layouts/base.jinja"), Tier::Layout);
69 }
70
71 #[test]
72 fn infers_feature_from_path() {
73 assert_eq!(Tier::from_path("features/schema.jinja"), Tier::Feature);
74 }
75
76 #[test]
77 fn infers_knowledge_from_md() {
78 assert_eq!(Tier::from_path("knowledge/overview.md"), Tier::Knowledge);
79 }
80}