Skip to main content

oak_handlebars/ast/
mod.rs

1use core::range::Range;
2use serde::{Deserialize, Serialize};
3
4/// Strongly-typed AST root node for Handlebars templates.
5#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
6pub struct HandlebarsRoot {
7    pub nodes: Vec<TemplateNode>,
8}
9
10#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
11pub enum TemplateNode {
12    Content(Content),
13    Mustache(Mustache),
14    Block(Block),
15    Comment(Comment),
16    Partial(Partial),
17}
18
19#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
20pub struct Content {
21    pub text: String,
22    #[serde(with = "oak_core::serde_range")]
23    pub span: Range<usize>,
24}
25
26#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
27pub struct Mustache {
28    pub expression: Expression,
29    pub is_unescaped: bool,
30    #[serde(with = "oak_core::serde_range")]
31    pub span: Range<usize>,
32}
33
34#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
35pub struct Block {
36    pub name: String,
37    pub params: Vec<Expression>,
38    pub body: Vec<TemplateNode>,
39    pub inverse: Option<Vec<TemplateNode>>,
40    #[serde(with = "oak_core::serde_range")]
41    pub span: Range<usize>,
42}
43
44#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
45pub struct Comment {
46    pub text: String,
47    #[serde(with = "oak_core::serde_range")]
48    pub span: Range<usize>,
49}
50
51#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
52pub struct Partial {
53    pub name: String,
54    pub params: Vec<Expression>,
55    #[serde(with = "oak_core::serde_range")]
56    pub span: Range<usize>,
57}
58
59#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
60pub enum Expression {
61    Path(String),
62    Literal(Literal),
63    SubExpression(Box<Expression>),
64}
65
66#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
67pub enum Literal {
68    String(String),
69    Number(f64),
70    Boolean(bool),
71}