greentic_dev/
toolchain_catalogue.rs1#[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}