1use builder_pattern::Builder;
4use sipha_core::{span::Span, token::Token, traits::NodeId, traits::RuleId, traits::TokenKind};
5
6use crate::children::NodeChildren;
7
8#[derive(Clone, Debug)]
10pub enum CstKind<K: TokenKind, R: RuleId> {
11 Token(K),
13 Rule(R),
15 Trivia(K),
17 Error(&'static str),
19}
20
21#[derive(Builder, Clone, Debug)]
23pub struct CstNode<K: TokenKind, R: RuleId, N: NodeId> {
24 pub kind: CstKind<K, R>,
26 pub span: Span,
28 #[default(NodeChildren::new())]
30 pub children: NodeChildren<N>,
31}
32
33impl<K: TokenKind, R: RuleId, N: NodeId> CstNode<K, R, N> {
34 pub fn create(kind: CstKind<K, R>, span: Span, children: NodeChildren<N>) -> Self {
38 Self {
39 kind,
40 span,
41 children,
42 }
43 }
44}
45
46impl<K: TokenKind, R: RuleId, N: NodeId> From<&Token<K>> for CstNode<K, R, N> {
47 fn from(token: &Token<K>) -> Self {
48 Self {
49 kind: CstKind::Token(token.kind),
50 span: token.span.clone(),
51 children: NodeChildren::new(),
52 }
53 }
54}