Skip to main content

oak_handlebars/ast/
mod.rs

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