use super::{Cliff, Contribution, Conversion, Expense, Income, Trigger};
#[derive(Debug, Clone, Copy)]
pub(crate) struct Span<'a> {
pub start: Option<&'a Trigger>,
pub end: Option<&'a Trigger>,
pub on: Option<&'a Trigger>,
}
impl<'a> Span<'a> {
const fn new(
start: Option<&'a Trigger>,
end: Option<&'a Trigger>,
on: Option<&'a Trigger>,
) -> Self {
Self { start, end, on }
}
pub(crate) fn triggers(self) -> impl Iterator<Item = (&'static str, &'a Trigger)> {
[("start", self.start), ("end", self.end), ("on", self.on)]
.into_iter()
.filter_map(|(key, trigger)| Some((key, trigger?)))
}
pub(crate) fn first(self) -> Option<&'a Trigger> {
self.start.or(self.on)
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
pub(crate) enum Node<'a> {
Event(&'a str),
Income(&'a str),
}
impl Income {
pub(crate) fn span(&self) -> Span<'_> {
Span::new(self.start.as_ref(), self.end.as_ref(), self.on.as_ref())
}
}
impl Expense {
pub(crate) fn span(&self) -> Span<'_> {
Span::new(self.start.as_ref(), self.end.as_ref(), self.on.as_ref())
}
}
impl Conversion {
pub(crate) fn span(&self) -> Span<'_> {
Span::new(self.start.as_ref(), self.end.as_ref(), self.on.as_ref())
}
}
impl Contribution {
pub(crate) fn span(&self) -> Span<'_> {
Span::new(self.start.as_ref(), self.end.as_ref(), self.on.as_ref())
}
}
impl Cliff {
pub(crate) fn span(&self) -> Span<'_> {
Span::new(self.start.as_ref(), self.end.as_ref(), None)
}
}