use std::collections::HashMap;
use chrono::{DateTime, Local};
use serde::{Deserialize, Serialize};
#[derive(Serialize, Deserialize, Debug, Clone, Default)]
#[serde(rename_all = "lowercase")]
pub struct Metadata {
pub name: String,
pub namespace: String,
pub labels: Option<HashMap<String, String>>,
pub annotations: Option<HashMap<String, String>>,
pub uid: Option<String>,
#[serde(rename = "resourceVersion")]
pub resource_version: Option<String>,
#[serde(rename = "creationTimestamp")]
pub creation_timestamp: Option<DateTime<Local>>,
}
impl Metadata {
pub fn fill_metadata_defaults(&mut self) {
if self.labels.is_none() {
self.labels = Some(HashMap::new());
}
if self.annotations.is_none() {
self.annotations = Some(HashMap::new());
}
if self.uid.is_none() {
self.uid = Some(crate::generate_uid());
}
if self.resource_version.is_none() {
self.resource_version = Some(crate::generate_resource_version());
}
if self.creation_timestamp.is_none() {
self.creation_timestamp = Some(Local::now());
}
}
}
#[cfg(test)]
mod tests {
use super::*; use std::collections::HashMap;
#[test]
fn test_fill_metadata_defaults() {
let mut metadata = Metadata {
name: "example-metadata".to_string(),
namespace: "default".to_string(),
labels: None,
annotations: None,
uid: None,
resource_version: None,
creation_timestamp: None,
};
metadata.fill_metadata_defaults();
assert_eq!(metadata.name, "example-metadata");
assert_eq!(metadata.namespace, "default");
assert!(metadata.labels.is_some());
assert_eq!(metadata.labels.unwrap(), HashMap::new());
assert!(metadata.annotations.is_some());
assert_eq!(metadata.annotations.unwrap(), HashMap::new());
assert!(metadata.uid.is_some());
assert!(!metadata.uid.as_ref().unwrap().is_empty());
assert!(metadata.resource_version.is_some());
assert!(!metadata.resource_version.as_ref().unwrap().is_empty());
assert!(metadata.creation_timestamp.is_some());
}
}