use oxyl_lexer::Span;
#[derive(Debug, Clone)]
pub struct Document {
pub preamble: Vec<Node>,
pub body: Vec<Node>
}
#[derive(Debug, Clone)]
pub enum Node {
Text(String, Span),
ParagraphBreak(Span),
Command {
name: String ,
args: Vec<Arg>,
body: Vec<Node>,
span: Span,
},
Environment {
name: String,
args: Vec<Arg>,
body: Vec<Node>,
span: Span,
},
Group(Vec<Node>, Span),
}
impl Node {
pub fn span(&self) -> Span {
match self {
Node::Text(_,s) => *s,
Node::ParagraphBreak(s) => *s,
Node::Command { span, .. } => *span,
Node::Environment { span, .. } => *span,
Node::Group(_, s) => *s,
}
}
}
#[derive(Debug, Clone)]
pub enum Arg {
Mandatory(Vec<Node>),
Optional(Vec<Node>),
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn text_node_span() {
let span = Span::new(0, 5);
let node = Node::Text("hello".into(), span);
assert_eq!(node.span(), span);
}
#[test]
fn group_node_span() {
let span = Span::new(2, 9);
let node = Node::Group(vec![], span);
assert_eq!(node.span(), span);
}
}