#[cfg(feature = "pretty-print")]
mod display;
use super::*;
#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum RangeKind {
Ordinal,
Offset,
}
#[derive(Clone, Debug, Default, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct RangeNode {
pub kind: RangeKind,
pub terms: Vec<RangeTermNode>,
pub span: Range<u32>,
}
impl ValkyrieNode for RangeNode {
fn get_range(&self) -> Range<usize> {
Range { start: self.span.start as usize, end: self.span.end as usize }
}
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum RangeTermNode {
Index {
index: ExpressionKind,
},
Range {
head: Option<ExpressionKind>,
tail: Option<ExpressionKind>,
step: Option<ExpressionKind>,
},
}
impl Default for RangeKind {
fn default() -> Self {
Self::Ordinal
}
}
impl RangeNode {
pub fn as_tuple(&self) -> Option<TupleNode> {
let mut terms = Vec::with_capacity(self.terms.len());
for term in &self.terms {
terms.push(term.as_tuple()?)
}
Some(TupleNode { kind: TupleKind::Tuple, terms: ArgumentsList { terms }, span: self.span.clone() })
}
}
impl RangeTermNode {
pub fn as_tuple(&self) -> Option<ArgumentTerm> {
match self {
RangeTermNode::Index { index } => {
Some(ArgumentTerm { modifiers: Default::default(), key: ArgumentKey::Nothing, value: index.clone() })
}
RangeTermNode::Range { .. } => None,
}
}
}