use super::*;
use core::num::NonZeroU64;
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct DotCallNode {
pub monadic: bool,
pub base: ExpressionKind,
pub term: DotCallTerm,
pub span: Range<u32>,
}
#[derive(Clone, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum DotCallTerm {
MetaType,
Integer(NonZeroU64),
Symbol(NamePathNode),
}
impl Debug for DotCallTerm {
fn fmt(&self, f: &mut Formatter<'_>) -> core::fmt::Result {
match self {
Self::MetaType => f.write_str("MetaType"),
Self::Integer(v) => Display::fmt(v, f),
Self::Symbol(v) => Display::fmt(v, f),
}
}
}
impl ValkyrieNode for DotCallNode {
fn get_range(&self) -> Range<usize> {
Range { start: self.span.start as usize, end: self.span.end as usize }
}
}
impl DotCallNode {
pub fn with_base(self, base: ExpressionKind) -> Self {
Self { base, ..self }
}
}
impl DotCallTerm {
pub fn index(u: usize) -> Self {
match NonZeroU64::new(u as u64) {
Some(n) => Self::Integer(n),
None => Self::MetaType,
}
}
}