use super::{Deriver, deriver::push_unique};
use crate::grammar::{Block, Unit};
impl Deriver<'_> {
pub(super) fn schema_bans(&self) -> Vec<String> {
self.schema
.core
.prohibited_patterns
.iter()
.map(|b| b.message.clone())
.collect()
}
pub(super) fn block_bans(&self, block: &Block) -> Vec<String> {
let mut out = Vec::new();
for unit in block.units() {
self.unit_bans(unit, &mut out);
}
out
}
fn unit_bans(&self, unit: &Unit, out: &mut Vec<String>) {
let format = unit.format_in(&self.schema.core.formats);
let bans = unit
.prohibited_patterns
.iter()
.chain(format.into_iter().flat_map(|f| f.prohibited.iter()));
push_unique(out, bans.map(|ban| ban.message.clone()));
for line in unit.lines.iter().flatten() {
self.unit_bans(line, out);
}
}
}