use super::*;
#[derive(Clone, PartialEq)]
pub enum Expression {
Empty,
Value(Literal),
Invoke(Box<Invoke>),
Range(Box<Expression>, Box<Expression>, bool),
Field(Box<Expression>, CompactString),
Index(Box<Expression>, Box<Expression>),
Try(Box<Expression>, bool),
Pipe(Box<Pipe>),
}
pub type ExpressionVec = SmallVec<[Expression; 1]>;
#[derive(Clone, Default, PartialEq)]
pub struct Invoke {
pub name: CompactString,
pub pos_args: ExpressionVec,
pub nom_args: FxHashMap<CompactString, Expression>,
}
#[derive(Clone, PartialEq)]
pub struct Pipe {
pub source: Expression,
pub stages: Vec<PipeSeg>,
}
#[derive(Clone, PartialEq)]
pub struct PipeSeg {
pub filter: bool,
pub invoke: Expression,
}
impl std::fmt::Debug for Expression {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Expression::Empty => write!(f, "_"),
Expression::Value(l) => std::fmt::Debug::fmt(l, f),
Expression::Invoke(c) => write!(f, "({:?})", c),
Expression::Field(e, i) => write!(f, "{e:?}.{}", bareword_format(i)),
Expression::Index(e, i) => write!(f, "{e:?}[{i:?}]"),
Expression::Range(s, e, inc) => if *inc {
write!(f, "{s:?}..={e:?}")
} else {
write!(f, "{s:?}..{e:?}")
},
Expression::Try(e, t) => if *t {
write!(f, "{e:?}?!")
} else {
write!(f, "{e:?}?")
},
Expression::Pipe(p) => write!(f, "{:?}", p),
}
}
}
impl From<Invoke> for Expression {
fn from(i: Invoke) -> Self {
Self::Invoke(i.into())
}
}
impl std::fmt::Debug for Invoke {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "{}", &self.name)?;
for arg in &self.pos_args {
write!(f, " {:?}", arg)?;
}
for (key, arg) in &self.nom_args {
write!(f, " {}={:?}", key, arg)?;
}
write!(f, "")
}
}
impl std::fmt::Debug for Pipe {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "{:?}", self.source)?;
for seg in &self.stages {
write!(f, " |")?;
if seg.filter {write!(f, "?")?}
write!(f, " {:?}", seg.invoke)?
}
write!(f, "")
}
}
pub mod html;