Skip to main content

tsx_forge/
tier.rs

1/// The four-tier template hierarchy used by forge.
2#[derive(Debug, Clone, PartialEq, Eq, Hash)]
3pub enum Tier {
4    /// Indivisible code fragments — cannot include other atoms.
5    Atom,
6    /// Atoms composed into a self-contained logical block.
7    Molecule,
8    /// File-level shell — wraps molecules with import hoisting.
9    Layout,
10    /// Top-level feature template — wires molecules into a layout.
11    Feature,
12    /// Markdown knowledge file for the Framework Protocol.
13    Knowledge,
14    /// Tier could not be determined from the path.
15    Unknown,
16}
17
18impl Tier {
19    /// Infer tier from template path (e.g. "atoms/drizzle/column.jinja" → Atom).
20    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}