greentic-dev 0.6.0-dev.25061653111

Developer CLI and local tooling for Greentic flows, packs, and components
Documentation
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub struct ToolchainPackageSpec {
    pub crate_name: &'static str,
    pub bins: &'static [&'static str],
}

pub const GREENTIC_TOOLCHAIN_PACKAGES: &[ToolchainPackageSpec] = &[
    ToolchainPackageSpec {
        crate_name: "greentic-dev",
        bins: &["greentic-dev"],
    },
    ToolchainPackageSpec {
        crate_name: "greentic-operator",
        bins: &["greentic-operator"],
    },
    ToolchainPackageSpec {
        crate_name: "greentic-bundle",
        bins: &["greentic-bundle"],
    },
    ToolchainPackageSpec {
        crate_name: "greentic-setup",
        bins: &["greentic-setup"],
    },
    ToolchainPackageSpec {
        crate_name: "greentic-start",
        bins: &["greentic-start"],
    },
    ToolchainPackageSpec {
        crate_name: "greentic-deployer",
        bins: &["greentic-deployer"],
    },
    ToolchainPackageSpec {
        crate_name: "greentic-component",
        bins: &["greentic-component"],
    },
    ToolchainPackageSpec {
        crate_name: "greentic-flow",
        bins: &["greentic-flow"],
    },
    ToolchainPackageSpec {
        crate_name: "greentic-pack",
        bins: &["greentic-pack"],
    },
    ToolchainPackageSpec {
        crate_name: "greentic-runner",
        bins: &["greentic-runner"],
    },
    ToolchainPackageSpec {
        crate_name: "greentic-gui",
        bins: &["greentic-gui"],
    },
    ToolchainPackageSpec {
        crate_name: "greentic-secrets",
        bins: &["greentic-secrets"],
    },
    ToolchainPackageSpec {
        crate_name: "greentic-mcp",
        bins: &["greentic-mcp"],
    },
];

#[cfg(test)]
mod tests {
    use super::GREENTIC_TOOLCHAIN_PACKAGES;
    use std::collections::BTreeSet;

    #[test]
    fn catalogue_contains_expected_public_toolchain() {
        let expected = [
            ("greentic-dev", "greentic-dev"),
            ("greentic-operator", "greentic-operator"),
            ("greentic-bundle", "greentic-bundle"),
            ("greentic-setup", "greentic-setup"),
            ("greentic-start", "greentic-start"),
            ("greentic-deployer", "greentic-deployer"),
            ("greentic-component", "greentic-component"),
            ("greentic-flow", "greentic-flow"),
            ("greentic-pack", "greentic-pack"),
            ("greentic-runner", "greentic-runner"),
            ("greentic-gui", "greentic-gui"),
            ("greentic-secrets", "greentic-secrets"),
            ("greentic-mcp", "greentic-mcp"),
        ];

        let actual = catalogue_pairs();
        for pair in expected {
            assert!(actual.contains(&pair), "missing {pair:?}");
        }
    }

    #[test]
    fn catalogue_has_no_duplicate_crate_bin_pairs() {
        let mut seen = BTreeSet::new();
        for package in GREENTIC_TOOLCHAIN_PACKAGES {
            for bin in package.bins {
                assert!(
                    seen.insert((package.crate_name, *bin)),
                    "duplicate crate/bin pair: {}/{}",
                    package.crate_name,
                    bin
                );
            }
        }
    }

    fn catalogue_pairs() -> BTreeSet<(&'static str, &'static str)> {
        GREENTIC_TOOLCHAIN_PACKAGES
            .iter()
            .flat_map(|package| {
                package
                    .bins
                    .iter()
                    .map(move |bin| (package.crate_name, *bin))
            })
            .collect()
    }
}