use super::super::nodes::PGM;
use crate::prog_gen::supported_testers::SupportedTester;
use crate::ast::*;
use crate::Result;
pub struct TargetTester {
tester: SupportedTester,
}
pub fn run(node: &Node<PGM>, tester: SupportedTester) -> Result<Node<PGM>> {
let mut p = TargetTester { tester: tester };
Ok(node.process(&mut p)?.unwrap())
}
impl Processor<PGM> for TargetTester {
fn on_node(&mut self, node: &Node<PGM>) -> Result<Return<PGM>> {
match &node.attrs {
PGM::TesterEq(testers) => {
if testers
.iter()
.any(|t_eq| self.tester.is_compatible_with(t_eq))
{
Ok(Return::UnwrapWithProcessedChildren)
} else {
Ok(Return::None)
}
}
PGM::TesterNeq(testers) => {
if testers
.iter()
.any(|t_neq| self.tester.is_compatible_with(t_neq))
{
Ok(Return::None)
} else {
Ok(Return::UnwrapWithProcessedChildren)
}
}
_ => Ok(Return::ProcessChildren),
}
}
}