mod display;
use crate::{
ArgumentKey, ExpressionKind, ExpressionNode, IdentifierNode, ModifierList, NamePathNode, StatementBlock, StatementKind,
};
use alloc::{boxed::Box, vec, vec::Vec};
use core::{
fmt::{Debug, Formatter},
ops::Range,
};
use deriver::From;
#[cfg(feature = "pretty-print")]
use pretty_print::{
helpers::{PrettySequence, SoftBlock},
PrettyBuilder, PrettyPrint, PrettyProvider, PrettyTree,
};
#[derive(Clone, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct PatternsList {
pub branches: Vec<PatternBranch>,
pub span: Range<u32>,
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct PatternBranch {
pub condition: PatternCondition,
pub continuation: StatementBlock,
pub span: Range<u32>,
}
#[derive(Clone, PartialEq, Eq, Hash, From)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum PatternCondition {
Case(PatternCaseNode),
When(PatternWhenNode),
Type(PatternTypeNode),
Else,
}
impl Debug for PatternCondition {
fn fmt(&self, f: &mut Formatter<'_>) -> core::fmt::Result {
match self {
Self::Case(v) => Debug::fmt(v, f),
Self::When(v) => Debug::fmt(v, f),
Self::Type(v) => Debug::fmt(v, f),
Self::Else => f.write_str("Guaranteed"),
}
}
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct PatternCaseNode {
pub pattern: PatternNode,
pub guard: Option<ExpressionKind>,
pub span: Range<u32>,
}
#[derive(Clone, PartialEq, Eq, Hash, From)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum PatternNode {
Symbol(Box<ArgumentKey>),
Tuple(Box<TuplePatternNode>),
Class(Box<ClassPatternNode>),
Union(Box<UnionPatternNode>),
Array(Box<ArrayPatternNode>),
Atom(Box<IdentifierPattern>),
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct IdentifierPattern {
pub modifiers: ModifierList,
pub identifier: IdentifierNode,
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct UnionPatternNode {
pub bind: Option<IdentifierNode>,
pub terms: Vec<PatternNode>,
pub span: Range<u32>,
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct TuplePatternNode {
pub bind: Option<IdentifierNode>,
pub name: Option<NamePathNode>,
pub terms: Vec<PatternNode>,
pub span: Range<u32>,
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct ClassPatternNode {
pub bind: Option<IdentifierNode>,
pub name: Option<NamePathNode>,
pub terms: Vec<PatternNode>,
pub span: Range<u32>,
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct ArrayPatternNode {
pub bind: Option<IdentifierNode>,
pub terms: Vec<PatternNode>,
pub span: Range<u32>,
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct ImplicitCaseNode {
pub pattern: PatternNode,
pub body: ExpressionNode,
pub span: Range<u32>,
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct PatternWhenNode {
pub guard: ExpressionKind,
pub span: Range<u32>,
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct PatternTypeNode {
pub typing: ExpressionKind,
pub guard: Option<ExpressionKind>,
pub span: Range<u32>,
}
impl PatternsList {
pub fn new(capacity: usize, span: &Range<u32>) -> Self {
Self { branches: Vec::with_capacity(capacity), span: span.clone() }
}
}