use serde::{Deserialize, Serialize};
use zpl_toolchain_diagnostics::Span;
#[derive(Debug, Clone, Serialize, Deserialize, Default, PartialEq)]
pub struct Ast {
pub labels: Vec<Label>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct Label {
pub nodes: Vec<Node>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(tag = "kind")]
#[non_exhaustive]
pub enum Node {
Command {
code: String,
args: Vec<ArgSlot>,
span: Span,
},
FieldData {
content: String,
hex_escaped: bool,
span: Span,
},
RawData {
command: String,
#[serde(skip_serializing_if = "Option::is_none")]
data: Option<String>,
span: Span,
},
Trivia {
text: String,
span: Span,
},
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct ArgSlot {
#[serde(skip_serializing_if = "Option::is_none")]
pub key: Option<String>,
pub presence: Presence,
#[serde(skip_serializing_if = "Option::is_none")]
pub value: Option<String>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq)]
#[serde(rename_all = "lowercase")]
pub enum Presence {
#[default]
Unset,
Empty,
Value,
}