1#![doc = include_str!("readme.md")]
2use crate::language::NimLanguage;
3use core::range::Range;
4use oak_core::tree::RedNode;
5use std::sync::Arc;
6
7#[derive(Debug, Clone, PartialEq)]
9#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
10pub struct NimModule {
11 pub items: Vec<Item>,
13}
14
15#[derive(Debug, Clone, PartialEq)]
17#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
18pub enum Item {
19 Statement(Statement),
21 Declaration(Arc<Declaration>),
23}
24
25#[derive(Debug, Clone, PartialEq)]
27#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
28pub enum Statement {
29 Expression(Expression),
31 Static(Arc<Block>),
33 When {
35 branches: Vec<WhenBranch>,
37 else_branch: Option<Arc<Block>>,
39 },
40 }
42
43#[derive(Debug, Clone, PartialEq)]
45#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
46pub struct WhenBranch {
47 pub condition: Expression,
49 pub body: Arc<Block>,
51}
52
53#[derive(Debug, Clone, PartialEq)]
55#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
56pub struct Declaration {
57 pub name: String,
59 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
61 pub span: Range<usize>,
62}
63
64#[derive(Debug, Clone, PartialEq)]
66#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
67pub enum Expression {
68 Literal(String),
70 Identifier(String),
72 }
74
75#[derive(Debug, Clone, PartialEq)]
77#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
78pub struct Block {
79 pub statements: Vec<Statement>,
81 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
83 pub span: Range<usize>,
84}