#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
pub enum K8sBuiltinResource {
Job,
ConfigMap,
}
impl K8sBuiltinResource {
pub const ALL: [Self; 2] = [Self::Job, Self::ConfigMap];
pub const fn api_version(self) -> &'static str {
match self {
Self::Job => "batch/v1",
Self::ConfigMap => "v1",
}
}
pub const fn kind(self) -> &'static str {
match self {
Self::Job => "Job",
Self::ConfigMap => "ConfigMap",
}
}
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!(K8sBuiltinResource::ALL.len(), 2);
let mut seen = std::collections::HashSet::new();
for v in K8sBuiltinResource::ALL {
assert!(seen.insert(v), "duplicate variant in ALL: {v:?}");
}
}
#[test]
fn job_api_version_is_batch_v1() {
assert_eq!(K8sBuiltinResource::Job.api_version(), "batch/v1");
}
#[test]
fn config_map_api_version_is_bare_v1() {
assert_eq!(K8sBuiltinResource::ConfigMap.api_version(), "v1");
}
#[test]
fn job_kind_is_pascalcase_job() {
assert_eq!(K8sBuiltinResource::Job.kind(), "Job");
}
#[test]
fn config_map_kind_is_pascalcase_config_map() {
assert_eq!(K8sBuiltinResource::ConfigMap.kind(), "ConfigMap");
}
#[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 K8sBuiltinResource::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 J_AV: &str = K8sBuiltinResource::Job.api_version();
const J_K: &str = K8sBuiltinResource::Job.kind();
const C_AV: &str = K8sBuiltinResource::ConfigMap.api_version();
const C_K: &str = K8sBuiltinResource::ConfigMap.kind();
assert_eq!(J_AV, "batch/v1");
assert_eq!(J_K, "Job");
assert_eq!(C_AV, "v1");
assert_eq!(C_K, "ConfigMap");
}
#[test]
fn wire_identity_pairs_api_version_and_kind_per_variant() {
for v in K8sBuiltinResource::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 J: crate::k8s_wire_identity::K8sWireIdentity =
K8sBuiltinResource::Job.wire_identity();
const C: crate::k8s_wire_identity::K8sWireIdentity =
K8sBuiltinResource::ConfigMap.wire_identity();
assert_eq!(J.api_version, "batch/v1");
assert_eq!(J.kind, "Job");
assert_eq!(C.api_version, "v1");
assert_eq!(C.kind, "ConfigMap");
}
#[test]
fn projections_are_pure_functions_of_the_variant() {
for v in K8sBuiltinResource::ALL {
assert_eq!(v.api_version(), v.api_version());
assert_eq!(v.kind(), v.kind());
}
}
#[test]
fn peers_do_not_share_wire_form_pairs_with_flux_resource_or_routing_edge_resource() {
use crate::flux_resource::FluxResource;
use crate::routing_edge_resource::RoutingEdgeResource;
for k in K8sBuiltinResource::ALL {
for f in FluxResource::ALL {
assert_ne!(
(k.api_version(), k.kind()),
(f.api_version(), f.kind()),
"K8sBuiltinResource {k:?} must not share a wire-form pair with FluxResource {f:?}"
);
}
for r in RoutingEdgeResource::ALL {
assert_ne!(
(k.api_version(), k.kind()),
(r.api_version(), r.kind()),
"K8sBuiltinResource {k:?} must not share a wire-form pair with RoutingEdgeResource {r:?}"
);
}
}
}
}