From 472d7c923a2f2405bd9479c7b2c304aa17fe3f37 Mon Sep 17 00:00:00 2001 From: Gabriel Simmer Date: Thu, 4 Jul 2024 00:11:46 +0100 Subject: [PATCH] Macros for manifest file list Why not amiright. --- Cargo.lock | 3 +++ Cargo.toml | 11 +++++++++++ src/lib.rs | 29 +++++++++++++++++++++++++++++ src/manifests/mod.rs | 4 +++- src/manifests/vaultwarden.rs | 2 +- 5 files changed, 47 insertions(+), 2 deletions(-) create mode 100644 src/lib.rs diff --git a/Cargo.lock b/Cargo.lock index c78340c..9109fa2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -29,8 +29,11 @@ name = "infra-rs" version = "0.1.0" dependencies = [ "k8s-openapi", + "proc-macro2", + "quote", "serde", "serde_json", + "syn", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index d7cafca..a4f8e93 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -3,7 +3,18 @@ name = "infra-rs" version = "0.1.0" edition = "2021" +[lib] +proc-macro = true + [dependencies] k8s-openapi = { version = "0.22.0", features = ["v1_30"] } +proc-macro2 = "1.0.86" +quote = "1.0.36" serde = { version = "1.0.203", features = ["derive"] } serde_json = "1.0.120" +syn = "2.0.68" + +[profile.release] +lto = true +strip = true +codegen-units = 1 diff --git a/src/lib.rs b/src/lib.rs new file mode 100644 index 0000000..5e7cb6b --- /dev/null +++ b/src/lib.rs @@ -0,0 +1,29 @@ +use std::fs; + +use quote::quote; + +#[proc_macro] +pub fn manifest_list(dir: proc_macro::TokenStream) -> proc_macro::TokenStream { + let dir = dir.to_string(); + let dir = dir.trim_matches('"'); + let paths: Vec = fs::read_dir(dir).unwrap().filter_map(|entry| { + let path = entry.ok()?.path(); + if path.is_file() && path.file_name()?.to_str() != Some("mod.rs") { + path.file_name()?.to_str().map(|s| s.to_owned().replace(".rs", "")) + } else { + None + } + }).collect(); + + // Generate the output tokens + let paths: Vec = paths.iter().map(|path| { + let ident = syn::Ident::new(path, proc_macro2::Span::call_site()); + quote! { #ident::render() } + }).collect(); + + let gen = quote! { + vec![#(#paths),*].into_iter().flatten().collect() + }; + + gen.into() +} diff --git a/src/manifests/mod.rs b/src/manifests/mod.rs index c0e3ac0..2513ddf 100644 --- a/src/manifests/mod.rs +++ b/src/manifests/mod.rs @@ -1,9 +1,11 @@ +use infra_rs::manifest_list; + use crate::infra_rs::ResourceList; mod vaultwarden; pub fn render() -> ResourceList { - let resources = vec![vaultwarden::render()].into_iter().flatten().collect(); + let resources = manifest_list!("./src/manifests"); ResourceList { items: resources, diff --git a/src/manifests/vaultwarden.rs b/src/manifests/vaultwarden.rs index adfa108..3c92adf 100644 --- a/src/manifests/vaultwarden.rs +++ b/src/manifests/vaultwarden.rs @@ -3,7 +3,7 @@ use serde_json::Value; use crate::infra_rs::{ deployment::{self, Deployment, DeploymentEnv}, ingress::{self, Ingress}, - service::{self, Service}, + service, Resource, };