#![doc = include_str!("readme.md")]
use core::range::Range;
use std::{boxed::Box, string::String, vec::Vec};
use crate::ElixirTokenType;
#[derive(Debug, PartialEq, Eq, Clone)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct Identifier {
pub name: String,
#[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
pub span: Range<usize>,
}
#[derive(Debug, PartialEq, Clone)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct ElixirRoot {
pub items: Vec<Item>,
}
#[derive(Debug, PartialEq, Clone)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum Item {
Module(Module),
Function(Function),
Statement(Statement),
}
#[derive(Debug, PartialEq, Clone)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct Module {
pub name: Identifier,
pub items: Vec<Item>,
#[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
pub span: Range<usize>,
}
#[derive(Debug, PartialEq, Clone)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct Function {
pub name: Identifier,
pub params: Vec<Param>,
pub body: Block,
#[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
pub span: Range<usize>,
}
#[derive(Debug, PartialEq, Clone)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct Param {
pub name: Identifier,
pub ty: Option<String>,
#[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
pub span: Range<usize>,
}
#[derive(Debug, PartialEq, Clone)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct Block {
pub statements: Vec<Statement>,
#[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
pub span: Range<usize>,
}
#[derive(Debug, PartialEq, Clone)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum Statement {
Let {
name: Identifier,
expr: Expr,
#[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
span: Range<usize>,
},
ExprStmt {
expr: Expr,
#[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
span: Range<usize>,
},
}
#[derive(Debug, PartialEq, Clone)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum Expr {
Ident(Identifier),
Atom {
value: String,
#[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
span: Range<usize>,
},
Number {
value: String,
#[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
span: Range<usize>,
},
String {
value: String,
#[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
span: Range<usize>,
},
Bool {
value: bool,
#[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
span: Range<usize>,
},
Unary {
op: ElixirTokenType,
expr: Box<Expr>,
#[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
span: Range<usize>,
},
Binary {
left: Box<Expr>,
op: ElixirTokenType,
right: Box<Expr>,
#[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
span: Range<usize>,
},
Match {
left: Box<Expr>,
right: Box<Expr>,
#[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
span: Range<usize>,
},
Call {
callee: Box<Expr>,
args: Vec<Expr>,
#[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
span: Range<usize>,
},
Field {
receiver: Box<Expr>,
field: Identifier,
#[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
span: Range<usize>,
},
Attribute {
name: Identifier,
#[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
span: Range<usize>,
},
Index {
receiver: Box<Expr>,
index: Box<Expr>,
#[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
span: Range<usize>,
},
Paren {
expr: Box<Expr>,
#[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
span: Range<usize>,
},
List {
items: Vec<Expr>,
#[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
span: Range<usize>,
},
Tuple {
items: Vec<Expr>,
#[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
span: Range<usize>,
},
Map {
items: Vec<Expr>,
#[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
span: Range<usize>,
},
Block(Block),
}