use std::ops::Deref;
use std::sync::LazyLock;
use super::Policy;
pub struct BuiltInPolicy {
pub name: &'static str,
policy: LazyLock<Policy>,
}
impl BuiltInPolicy {
pub fn policy(&self) -> &Policy {
&self.policy
}
}
impl Deref for BuiltInPolicy {
type Target = Policy;
fn deref(&self) -> &Self::Target {
self.policy()
}
}
macro_rules! define_builtin_policies {
($(
$(#[$attr:meta])*
$const_name:ident = $policy_name:literal
),* $(,)?) => {
$(
#[doc = concat!("`", $policy_name, "`: ")]
$(#[$attr])*
#[doc = ""]
#[doc = "Policy content:"]
#[doc = "```text"]
#[doc = include_str!(concat!(
"../../builtin-policies/",
$policy_name,
".builtin-policy"
))]
#[doc = "```"]
pub static $const_name: BuiltInPolicy = BuiltInPolicy {
name: $policy_name,
policy: LazyLock::new(|| {
Policy::parse(include_str!(concat!(
"../../builtin-policies/",
$policy_name,
".builtin-policy"
)))
.expect(concat!("Failed to parse built-in policy: ", $policy_name))
}),
};
)*
pub(crate) fn builtin(name: &str) -> Option<&'static Policy> {
match name {
$(
$policy_name => Some(&$const_name.policy()),
)*
_ => None,
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn parse_builtin_policies() {
$(
let _policy = $const_name.policy();
)*
}
}
};
}
define_builtin_policies! {
SIGSUM_TEST1_2025 = "sigsum-test1-2025",
SIGSUM_TEST2_2025 = "sigsum-test2-2025",
SIGSUM_TEST_2025_3 = "sigsum-test-2025-3",
SIGSUM_GENERIC_2025_1 = "sigsum-generic-2025-1",
}