k8_obj_metadata/
lib.rs

1//!
2//! # CRD traits
3//!
4//! Trait for CRD Spec/Status definition
5//!
6mod crd;
7mod metadata;
8pub mod options;
9pub mod store;
10
11pub use self::crd::*;
12pub use self::metadata::*;
13
14use serde::de::DeserializeOwned;
15use serde::Deserialize;
16use serde::Serialize;
17use std::fmt::Debug;
18
19pub trait Status:
20    Sized + Debug + Clone + Default + Serialize + DeserializeOwned + Send + Sync
21{
22}
23
24pub trait Header:
25    Sized + Debug + Clone + Default + Serialize + DeserializeOwned + Send + Sync
26{
27}
28
29/// Kubernetes Spec
30pub trait Spec:
31    Sized + Debug + Clone + Default + Serialize + DeserializeOwned + Send + Sync
32{
33    type Status: Status;
34
35    type Header: Header;
36
37    /// if true, spec is namespaced
38    const NAME_SPACED: bool = true;
39
40    /// return uri for single instance
41    fn metadata() -> &'static Crd;
42
43    fn label() -> &'static str {
44        Self::metadata().names.kind
45    }
46
47    fn api_version() -> String {
48        let metadata = Self::metadata();
49        if metadata.group == "core" {
50            return metadata.version.to_owned();
51        }
52        format!("{}/{}", metadata.group, metadata.version)
53    }
54
55    fn kind() -> String {
56        Self::metadata().names.kind.to_owned()
57    }
58
59    /// in case of applying, we have some fields that are generated
60    /// or override.  So need to special logic to reset them so we can do proper comparison
61    fn make_same(&mut self, _other: &Self) {}
62}
63
64#[derive(Deserialize, Serialize, Debug, Default, Clone)]
65pub struct DefaultHeader {}
66
67impl Header for DefaultHeader {}