diff --git a/src/environment.rs b/src/environment.rs index 7cf3569..904e36e 100644 --- a/src/environment.rs +++ b/src/environment.rs @@ -1,8 +1,8 @@ use std::net::Ipv4Addr; use std::ops::Deref; use std::path::{Path, PathBuf}; -use std::str::FromStr; +use minijinja::value::ViaDeserialize; use minijinja::{AutoEscape, Environment, path_loader}; use walkdir::WalkDir; @@ -16,6 +16,13 @@ pub struct PathEnvironment<'a> { path: PathBuf, } +fn apply_netmask( + ip: ViaDeserialize, + netmask: ViaDeserialize, +) -> Result { + Ok((*ip & *netmask).to_string()) +} + impl<'a> PathEnvironment<'a> { pub fn new(path: &Path) -> Self { let mut env = Environment::new(); @@ -27,10 +34,7 @@ impl<'a> PathEnvironment<'a> { env.set_auto_escape_callback(|_| AutoEscape::None); // Add filters - env.add_filter("to_prefix", |netmask: String| { - let netmask = Ipv4Addr::from_str(&netmask).map_err(|err| { - minijinja::Error::new(minijinja::ErrorKind::InvalidOperation, err.to_string()) - })?; + env.add_filter("to_prefix", |netmask: ViaDeserialize| { let mask = netmask.to_bits(); let prefix = mask.leading_ones(); @@ -44,6 +48,8 @@ impl<'a> PathEnvironment<'a> { } }); + env.add_function("apply_netmask", apply_netmask); + // Helper function for getting the path to kubeconfig files env.add_filter("kubeconfig", move |names: Vec| { names