#[macro_export]
macro_rules! subclause_and {
($id:expr) => {
SubClause::IsMounted($id)
};
($($rest:expr),+ $(,)?) => {
SubClause::AndMany(vec![
$(SubClause::IsMounted($rest)),*
])
};
}
#[macro_export]
macro_rules! subclause_and_not {
($id:expr) => {
SubClause::not(SubClause::IsMounted($id))
};
($($rest:expr),+ $(,)?) => {
SubClause::AndMany(vec![
$(SubClause::not(
SubClause::IsMounted($rest)
)),*
])
};
}
#[macro_export]
macro_rules! subclause_or {
($id:expr) => {
SubClause::IsMounted($id)
};
($($rest:expr),+ $(,)?) => {
SubClause::OrMany(vec![
$(SubClause::IsMounted($rest)),*
])
};
}
#[cfg(test)]
mod tests {
use crate::mock::MockComponentId;
use crate::subscription::SubClause;
#[test]
fn subclause_and() {
assert_eq!(
subclause_and!(MockComponentId::InputBar),
SubClause::IsMounted(MockComponentId::InputBar),
);
assert_eq!(
subclause_and!(
MockComponentId::InputBar,
MockComponentId::InputFoo,
MockComponentId::InputOmar
),
SubClause::AndMany(vec![
SubClause::IsMounted(MockComponentId::InputBar),
SubClause::IsMounted(MockComponentId::InputFoo),
SubClause::IsMounted(MockComponentId::InputOmar),
])
);
assert_eq!(
subclause_and!(
MockComponentId::InputBar,
MockComponentId::InputFoo,
MockComponentId::InputOmar,
),
SubClause::AndMany(vec![
SubClause::IsMounted(MockComponentId::InputBar),
SubClause::IsMounted(MockComponentId::InputFoo),
SubClause::IsMounted(MockComponentId::InputOmar),
])
);
}
#[test]
fn subclause_and_not() {
assert_eq!(
subclause_and_not!(MockComponentId::InputBar),
SubClause::not(SubClause::IsMounted(MockComponentId::InputBar)),
);
assert_eq!(
subclause_and_not!(
MockComponentId::InputBar,
MockComponentId::InputFoo,
MockComponentId::InputOmar
),
SubClause::AndMany(vec![
SubClause::not(SubClause::IsMounted(MockComponentId::InputBar)),
SubClause::not(SubClause::IsMounted(MockComponentId::InputFoo)),
SubClause::not(SubClause::IsMounted(MockComponentId::InputOmar)),
])
);
assert_eq!(
subclause_and_not!(
MockComponentId::InputBar,
MockComponentId::InputFoo,
MockComponentId::InputOmar,
),
SubClause::AndMany(vec![
SubClause::not(SubClause::IsMounted(MockComponentId::InputBar)),
SubClause::not(SubClause::IsMounted(MockComponentId::InputFoo)),
SubClause::not(SubClause::IsMounted(MockComponentId::InputOmar)),
])
);
}
#[test]
fn subclause_or() {
assert_eq!(
subclause_or!(MockComponentId::InputBar),
SubClause::IsMounted(MockComponentId::InputBar),
);
assert_eq!(
subclause_or!(
MockComponentId::InputBar,
MockComponentId::InputFoo,
MockComponentId::InputOmar
),
SubClause::OrMany(vec![
SubClause::IsMounted(MockComponentId::InputBar),
SubClause::IsMounted(MockComponentId::InputFoo),
SubClause::IsMounted(MockComponentId::InputOmar),
])
);
assert_eq!(
subclause_or!(
MockComponentId::InputBar,
MockComponentId::InputFoo,
MockComponentId::InputOmar,
),
SubClause::OrMany(vec![
SubClause::IsMounted(MockComponentId::InputBar),
SubClause::IsMounted(MockComponentId::InputFoo),
SubClause::IsMounted(MockComponentId::InputOmar),
])
);
}
}