Skip to main content

pln_parse/
ast.rs

1use serde::Serialize;
2
3/// A byte-offset span in the source text.
4#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize)]
5pub struct Span {
6    pub start: usize,
7    pub end: usize,
8}
9
10/// A layout item: a node with an optional size annotation.
11#[derive(Debug, Clone, PartialEq, Serialize)]
12pub struct Item {
13    #[serde(flatten)]
14    pub node: Node,
15    #[serde(skip_serializing_if = "Option::is_none")]
16    pub size: Option<Size>,
17    pub span: Span,
18}
19
20/// A layout node: either a leaf panel or a split group.
21#[derive(Debug, Clone, PartialEq, Serialize)]
22#[serde(tag = "type", rename_all = "snake_case")]
23pub enum Node {
24    Panel { name: String },
25    HSplit { children: Vec<Item> },
26    VSplit { children: Vec<Item> },
27}
28
29/// A size annotation.
30#[derive(Debug, Clone, PartialEq, Serialize)]
31pub struct Size {
32    pub value: f64,
33    pub unit: Unit,
34}
35
36/// Size units.
37#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize)]
38pub enum Unit {
39    #[serde(rename = "fr")]
40    Fr,
41    #[serde(rename = "col")]
42    Col,
43    #[serde(rename = "row")]
44    Row,
45    #[serde(rename = "px")]
46    Px,
47    #[serde(rename = "%")]
48    Percent,
49}