Skip to main content

greentic_dev/
toolchain_catalogue.rs

1#[derive(Clone, Copy, Debug, Eq, PartialEq)]
2pub struct ToolchainPackageSpec {
3    pub crate_name: &'static str,
4    pub bins: &'static [&'static str],
5}
6
7pub const GREENTIC_TOOLCHAIN_PACKAGES: &[ToolchainPackageSpec] = &[
8    ToolchainPackageSpec {
9        crate_name: "greentic-dev",
10        bins: &["greentic-dev"],
11    },
12    ToolchainPackageSpec {
13        crate_name: "greentic-operator",
14        bins: &["greentic-operator"],
15    },
16    ToolchainPackageSpec {
17        crate_name: "greentic-bundle",
18        bins: &["greentic-bundle"],
19    },
20    ToolchainPackageSpec {
21        crate_name: "greentic-setup",
22        bins: &["greentic-setup"],
23    },
24    ToolchainPackageSpec {
25        crate_name: "greentic-start",
26        bins: &["greentic-start"],
27    },
28    ToolchainPackageSpec {
29        crate_name: "greentic-deployer",
30        bins: &["greentic-deployer"],
31    },
32    ToolchainPackageSpec {
33        crate_name: "greentic-component",
34        bins: &["greentic-component"],
35    },
36    ToolchainPackageSpec {
37        crate_name: "greentic-flow",
38        bins: &["greentic-flow"],
39    },
40    ToolchainPackageSpec {
41        crate_name: "greentic-pack",
42        bins: &["greentic-pack"],
43    },
44    ToolchainPackageSpec {
45        crate_name: "greentic-runner",
46        bins: &["greentic-runner"],
47    },
48    ToolchainPackageSpec {
49        crate_name: "greentic-gui",
50        bins: &["greentic-gui"],
51    },
52    ToolchainPackageSpec {
53        crate_name: "greentic-secrets",
54        bins: &["greentic-secrets"],
55    },
56    ToolchainPackageSpec {
57        crate_name: "greentic-mcp",
58        bins: &["greentic-mcp"],
59    },
60];
61
62#[cfg(test)]
63mod tests {
64    use super::GREENTIC_TOOLCHAIN_PACKAGES;
65    use std::collections::BTreeSet;
66
67    #[test]
68    fn catalogue_contains_expected_public_toolchain() {
69        let expected = [
70            ("greentic-dev", "greentic-dev"),
71            ("greentic-operator", "greentic-operator"),
72            ("greentic-bundle", "greentic-bundle"),
73            ("greentic-setup", "greentic-setup"),
74            ("greentic-start", "greentic-start"),
75            ("greentic-deployer", "greentic-deployer"),
76            ("greentic-component", "greentic-component"),
77            ("greentic-flow", "greentic-flow"),
78            ("greentic-pack", "greentic-pack"),
79            ("greentic-runner", "greentic-runner"),
80            ("greentic-gui", "greentic-gui"),
81            ("greentic-secrets", "greentic-secrets"),
82            ("greentic-mcp", "greentic-mcp"),
83        ];
84
85        let actual = catalogue_pairs();
86        for pair in expected {
87            assert!(actual.contains(&pair), "missing {pair:?}");
88        }
89    }
90
91    #[test]
92    fn catalogue_has_no_duplicate_crate_bin_pairs() {
93        let mut seen = BTreeSet::new();
94        for package in GREENTIC_TOOLCHAIN_PACKAGES {
95            for bin in package.bins {
96                assert!(
97                    seen.insert((package.crate_name, *bin)),
98                    "duplicate crate/bin pair: {}/{}",
99                    package.crate_name,
100                    bin
101                );
102            }
103        }
104    }
105
106    fn catalogue_pairs() -> BTreeSet<(&'static str, &'static str)> {
107        GREENTIC_TOOLCHAIN_PACKAGES
108            .iter()
109            .flat_map(|package| {
110                package
111                    .bins
112                    .iter()
113                    .map(move |bin| (package.crate_name, *bin))
114            })
115            .collect()
116    }
117}