#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
pub enum FluxResource {
Kustomization,
HelmRelease,
OCIRepository,
}
impl FluxResource {
pub const ALL: [Self; 3] = [Self::Kustomization, Self::HelmRelease, Self::OCIRepository];
pub const fn api_version(self) -> &'static str {
match self {
Self::Kustomization => "kustomize.toolkit.fluxcd.io/v1",
Self::HelmRelease => "helm.toolkit.fluxcd.io/v2",
Self::OCIRepository => "source.toolkit.fluxcd.io/v1beta2",
}
}
pub const fn kind(self) -> &'static str {
match self {
Self::Kustomization => "Kustomization",
Self::HelmRelease => "HelmRelease",
Self::OCIRepository => "OCIRepository",
}
}
pub const fn wire_identity(self) -> crate::k8s_wire_identity::K8sWireIdentity {
crate::k8s_wire_identity::K8sWireIdentity::new(self.api_version(), self.kind())
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn all_enumerates_every_variant_exactly_once() {
assert_eq!(FluxResource::ALL.len(), 3);
let mut seen = std::collections::HashSet::new();
for v in FluxResource::ALL {
assert!(seen.insert(v), "duplicate variant in ALL: {v:?}");
}
}
#[test]
fn kustomization_api_version_is_kustomize_toolkit_v1() {
assert_eq!(
FluxResource::Kustomization.api_version(),
"kustomize.toolkit.fluxcd.io/v1"
);
}
#[test]
fn helm_release_api_version_is_helm_toolkit_v2() {
assert_eq!(
FluxResource::HelmRelease.api_version(),
"helm.toolkit.fluxcd.io/v2"
);
}
#[test]
fn oci_repository_api_version_is_source_toolkit_v1beta2() {
assert_eq!(
FluxResource::OCIRepository.api_version(),
"source.toolkit.fluxcd.io/v1beta2"
);
}
#[test]
fn kustomization_kind_is_pascalcase_kustomization() {
assert_eq!(FluxResource::Kustomization.kind(), "Kustomization");
}
#[test]
fn helm_release_kind_is_pascalcase_helm_release() {
assert_eq!(FluxResource::HelmRelease.kind(), "HelmRelease");
}
#[test]
fn oci_repository_kind_is_pascalcase_oci_repository() {
assert_eq!(FluxResource::OCIRepository.kind(), "OCIRepository");
}
#[test]
fn every_variants_api_version_and_kind_are_distinct_across_the_closed_set() {
let mut api_versions = std::collections::HashSet::new();
let mut kinds = std::collections::HashSet::new();
for v in FluxResource::ALL {
assert!(
api_versions.insert(v.api_version()),
"duplicate api_version at {v:?}: {}",
v.api_version()
);
assert!(
kinds.insert(v.kind()),
"duplicate kind at {v:?}: {}",
v.kind()
);
}
}
#[test]
fn api_version_and_kind_are_const_fn_reachable() {
const K_AV: &str = FluxResource::Kustomization.api_version();
const K_K: &str = FluxResource::Kustomization.kind();
const H_AV: &str = FluxResource::HelmRelease.api_version();
const H_K: &str = FluxResource::HelmRelease.kind();
const O_AV: &str = FluxResource::OCIRepository.api_version();
const O_K: &str = FluxResource::OCIRepository.kind();
assert_eq!(K_AV, "kustomize.toolkit.fluxcd.io/v1");
assert_eq!(K_K, "Kustomization");
assert_eq!(H_AV, "helm.toolkit.fluxcd.io/v2");
assert_eq!(H_K, "HelmRelease");
assert_eq!(O_AV, "source.toolkit.fluxcd.io/v1beta2");
assert_eq!(O_K, "OCIRepository");
}
#[test]
fn wire_identity_pairs_api_version_and_kind_per_variant() {
for v in FluxResource::ALL {
let id = v.wire_identity();
assert_eq!(id.api_version, v.api_version());
assert_eq!(id.kind, v.kind());
}
}
#[test]
fn wire_identity_is_const_reachable() {
const K: crate::k8s_wire_identity::K8sWireIdentity =
FluxResource::Kustomization.wire_identity();
const H: crate::k8s_wire_identity::K8sWireIdentity =
FluxResource::HelmRelease.wire_identity();
const O: crate::k8s_wire_identity::K8sWireIdentity =
FluxResource::OCIRepository.wire_identity();
assert_eq!(K.api_version, "kustomize.toolkit.fluxcd.io/v1");
assert_eq!(K.kind, "Kustomization");
assert_eq!(H.api_version, "helm.toolkit.fluxcd.io/v2");
assert_eq!(H.kind, "HelmRelease");
assert_eq!(O.api_version, "source.toolkit.fluxcd.io/v1beta2");
assert_eq!(O.kind, "OCIRepository");
}
#[test]
fn projections_are_pure_functions_of_the_variant() {
for v in FluxResource::ALL {
assert_eq!(v.api_version(), v.api_version());
assert_eq!(v.kind(), v.kind());
}
}
}