opening_hours_syntax/rules/
mod.rspub mod day;
pub mod time;
use std::fmt::Display;
use std::sync::Arc;
use crate::sorted_vec::UniqueSortedVec;
#[derive(Clone, Debug, Hash, PartialEq, Eq)]
pub struct OpeningHoursExpression {
pub rules: Vec<RuleSequence>,
}
impl Display for OpeningHoursExpression {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
let Some(first) = self.rules.first() else {
return Ok(());
};
write!(f, "{first}")?;
for rule in &self.rules[1..] {
let separator = match rule.operator {
RuleOperator::Normal => "; ",
RuleOperator::Additional => ", ",
RuleOperator::Fallback => " || ",
};
write!(f, "{separator}{rule}")?;
}
Ok(())
}
}
#[derive(Clone, Debug, Hash, PartialEq, Eq)]
pub struct RuleSequence {
pub day_selector: day::DaySelector,
pub time_selector: time::TimeSelector,
pub kind: RuleKind,
pub operator: RuleOperator,
pub comments: UniqueSortedVec<Arc<str>>,
}
impl Display for RuleSequence {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "{}", self.day_selector)?;
if !self.day_selector.is_empty() && !self.time_selector.time.is_empty() {
write!(f, " ")?;
}
write!(f, "{} {}", self.time_selector, self.kind)
}
}
#[derive(Copy, Clone, Debug, Hash, Eq, Ord, PartialEq, PartialOrd)]
pub enum RuleKind {
Open,
Closed,
Unknown,
}
impl RuleKind {
pub const fn as_str(self) -> &'static str {
match self {
Self::Open => "open",
Self::Closed => "closed",
Self::Unknown => "unknown",
}
}
}
impl Display for RuleKind {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "{}", self.as_str())
}
}
#[derive(Copy, Clone, Debug, Hash, Eq, PartialEq)]
pub enum RuleOperator {
Normal,
Additional,
Fallback,
}