use super::prohibitions_generated as generated;
pub use generated::{FORBIDDEN_ATTRIBUTES, FORBIDDEN_PATHS, TOTAL_PARAMS, UNEXTRACTED};
#[must_use]
pub fn forbidden_path(path: &str) -> Option<&'static str> {
FORBIDDEN_PATHS
.iter()
.find(|(_, ctx, rel)| crate::xml::path_matches(path, ctx, rel))
.map(|(id, _, _)| *id)
}
#[must_use]
pub fn forbidden_attribute(name: &str) -> Option<&'static str> {
FORBIDDEN_ATTRIBUTES
.iter()
.find(|(_, a)| *a == name)
.map(|(id, _)| *id)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn the_table_is_populated() {
assert!(FORBIDDEN_PATHS.len() > 300, "{}", FORBIDDEN_PATHS.len());
const { assert!(TOTAL_PARAMS > 400) };
}
#[test]
fn ram_id_is_not_forbidden_outright() {
for path in [
"rsm:CrossIndustryInvoice/rsm:ExchangedDocument/ram:ID",
"rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/\
ram:ApplicableHeaderTradeAgreement/ram:SellerTradeParty/ram:ID",
] {
assert_eq!(forbidden_path(path), None, "{path} must be allowed");
}
}
#[test]
fn legitimate_elements_are_not_forbidden() {
for path in [
"rsm:CrossIndustryInvoice/rsm:ExchangedDocument/ram:TypeCode",
"rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/\
ram:ApplicableHeaderTradeSettlement/\
ram:SpecifiedTradeSettlementHeaderMonetarySummation/ram:DuePayableAmount",
] {
assert_eq!(forbidden_path(path), None, "{path} must be allowed");
}
}
#[test]
fn a_real_prohibition_still_fires() {
let (rule, ctx, rel) = FORBIDDEN_PATHS[0];
let stem = ctx.trim_start_matches('/');
assert_eq!(forbidden_path(&format!("{stem}/{rel}")), Some(rule));
}
}