Macros for manifest file list

Why not amiright.
This commit is contained in:
Gabriel Simmer 2024-07-04 00:11:46 +01:00
parent 30d241ea4e
commit 472d7c923a
Signed by: arch
SSH key fingerprint: SHA256:m3OEcdtrnBpMX+2BDGh/byv3hrCekCLzDYMdvGEKPPQ
5 changed files with 47 additions and 2 deletions

3
Cargo.lock generated
View file

@ -29,8 +29,11 @@ name = "infra-rs"
version = "0.1.0"
dependencies = [
"k8s-openapi",
"proc-macro2",
"quote",
"serde",
"serde_json",
"syn",
]
[[package]]

View file

@ -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

29
src/lib.rs Normal file
View file

@ -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<String> = 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<proc_macro2::TokenStream> = 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()
}

View file

@ -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,

View file

@ -3,7 +3,7 @@ use serde_json::Value;
use crate::infra_rs::{
deployment::{self, Deployment, DeploymentEnv},
ingress::{self, Ingress},
service::{self, Service},
service,
Resource,
};