use std::fs;
use std::path::Path;
use crate::crd::{
Kafka, KafkaGrpcGateway, KafkaNodePool, KafkaRebalance, KafkaTopic, KafkaUser, SchemaRegistry,
};
pub fn write_all(out_dir: &Path) -> anyhow::Result<()> {
fs::create_dir_all(out_dir)?;
write_one::<Kafka>(out_dir)?;
write_one::<KafkaNodePool>(out_dir)?;
write_one::<KafkaTopic>(out_dir)?;
write_one::<KafkaUser>(out_dir)?;
write_one::<KafkaRebalance>(out_dir)?;
write_one::<KafkaGrpcGateway>(out_dir)?;
write_one::<SchemaRegistry>(out_dir)?;
Ok(())
}
fn write_one<K>(out_dir: &Path) -> anyhow::Result<()>
where
K: kube::Resource<DynamicType = ()> + kube::CustomResourceExt,
{
let crd = K::crd();
let group = &crd.spec.group;
let plural = &crd.spec.names.plural;
let file = out_dir.join(format!("{group}_{plural}.yaml"));
let yaml = serde_yaml::to_string(&crd)?;
fs::write(&file, yaml)?;
eprintln!("wrote {}", file.display());
Ok(())
}
#[cfg(test)]
mod tests {
use super::*;
use assert2::assert;
use tempfile::tempdir;
#[test]
fn writes_kafka_pool_topic_and_user_crd_files() {
let dir = tempdir().unwrap();
write_all(dir.path()).unwrap();
let kf = dir.path().join("crabka.io_kafkas.yaml");
let pf = dir.path().join("crabka.io_kafkanodepools.yaml");
let tf = dir.path().join("crabka.io_kafkatopics.yaml");
let uf = dir.path().join("crabka.io_kafkausers.yaml");
let rf = dir.path().join("crabka.io_kafkarebalances.yaml");
let gf = dir.path().join("crabka.io_kafkagrpcgateways.yaml");
assert!(kf.exists());
assert!(pf.exists());
assert!(tf.exists());
assert!(uf.exists());
assert!(rf.exists());
assert!(gf.exists());
let kafka = std::fs::read_to_string(&kf).unwrap();
assert!(kafka.contains("plural: kafkas"));
let pool = std::fs::read_to_string(&pf).unwrap();
assert!(pool.contains("plural: kafkanodepools"));
assert!(pool.contains("- knp"));
let topic = std::fs::read_to_string(&tf).unwrap();
assert!(topic.contains("plural: kafkatopics"));
assert!(topic.contains("- kt"));
let user = std::fs::read_to_string(&uf).unwrap();
assert!(user.contains("plural: kafkausers"));
assert!(user.contains("- ku"));
let rebalance = std::fs::read_to_string(&rf).unwrap();
assert!(rebalance.contains("plural: kafkarebalances"));
assert!(rebalance.contains("- kr"));
let gateway = std::fs::read_to_string(&gf).unwrap();
assert!(gateway.contains("plural: kafkagrpcgateways"));
assert!(gateway.contains("- kgg"));
let sf = dir.path().join("crabka.io_schemaregistries.yaml");
assert!(sf.exists());
let sr = std::fs::read_to_string(&sf).unwrap();
assert!(sr.contains("plural: schemaregistries"));
assert!(sr.contains("- sr"));
}
}