use crate::ArenaVec;
use crate::models::data::Data;
use crate::models::mdx::{MdxExpression, MdxJsxElement, MdxjsEsm};
use crate::models::position::Position;
#[derive(Debug, PartialEq)]
pub enum Node<'a> {
Root(Root<'a>),
Element(Element<'a>),
Text(Text<'a>),
Comment(Comment<'a>),
Doctype(Doctype<'a>),
Raw(Raw<'a>),
Unknown(Unknown<'a>),
MdxJsxFlowElement(MdxJsxElement<'a, Node<'a>>),
MdxJsxTextElement(MdxJsxElement<'a, Node<'a>>),
MdxFlowExpression(MdxExpression<'a>),
MdxTextExpression(MdxExpression<'a>),
MdxjsEsm(MdxjsEsm<'a>),
}
#[derive(Debug, PartialEq)]
pub struct Root<'a> {
pub children: ArenaVec<'a, Node<'a>>,
pub position: Option<Position<'a>>,
pub data: Option<&'a Data<'a>>,
pub quirks_mode: Option<bool>,
}
#[derive(Debug, PartialEq)]
pub struct Element<'a> {
pub tag_name: &'a str,
pub properties: ArenaVec<'a, Property<'a>>,
pub children: ArenaVec<'a, Node<'a>>,
pub position: Option<Position<'a>>,
pub data: Option<&'a Data<'a>>,
pub content: Option<&'a Root<'a>>,
}
#[derive(Debug, PartialEq)]
pub struct Property<'a> {
pub name: &'a str,
pub value: PropertyValue<'a>,
}
#[derive(Debug, PartialEq)]
pub enum PropertyValue<'a> {
Null,
Boolean(bool),
Number(f64),
String(&'a str),
List(ArenaVec<'a, PropertyItem<'a>>),
}
#[derive(Debug, PartialEq)]
pub enum PropertyItem<'a> {
Number(f64),
String(&'a str),
}
#[derive(Debug, PartialEq)]
pub struct Text<'a> {
pub value: &'a str,
pub position: Option<Position<'a>>,
pub data: Option<&'a Data<'a>>,
}
#[derive(Debug, PartialEq)]
pub struct Comment<'a> {
pub value: &'a str,
pub position: Option<Position<'a>>,
pub data: Option<&'a Data<'a>>,
}
#[derive(Debug, PartialEq)]
pub struct Raw<'a> {
pub value: &'a str,
pub position: Option<Position<'a>>,
pub data: Option<&'a Data<'a>>,
}
#[derive(Debug, PartialEq)]
pub struct Doctype<'a> {
pub position: Option<Position<'a>>,
pub data: Option<&'a Data<'a>>,
}
#[derive(Debug, PartialEq)]
pub struct Unknown<'a> {
pub kind: &'a str,
pub fields: &'a [(&'a str, Data<'a>)],
pub children: Option<ArenaVec<'a, Node<'a>>>,
pub position: Option<Position<'a>>,
pub data: Option<&'a Data<'a>>,
}
impl<'a> Node<'a> {
pub fn data(&self) -> Option<&'a Data<'a>> {
match self {
Node::Root(node) => node.data,
Node::Element(node) => node.data,
Node::Text(node) => node.data,
Node::Comment(node) => node.data,
Node::Doctype(node) => node.data,
Node::Raw(node) => node.data,
Node::Unknown(node) => node.data,
Node::MdxJsxFlowElement(node) | Node::MdxJsxTextElement(node) => node.data,
Node::MdxFlowExpression(node) | Node::MdxTextExpression(node) => node.data,
Node::MdxjsEsm(node) => node.data,
}
}
pub fn position(&self) -> Option<&Position<'a>> {
match self {
Node::Root(node) => node.position.as_ref(),
Node::Element(node) => node.position.as_ref(),
Node::Text(node) => node.position.as_ref(),
Node::Comment(node) => node.position.as_ref(),
Node::Doctype(node) => node.position.as_ref(),
Node::Raw(node) => node.position.as_ref(),
Node::Unknown(node) => node.position.as_ref(),
Node::MdxJsxFlowElement(node) | Node::MdxJsxTextElement(node) => {
node.position.as_ref()
}
Node::MdxFlowExpression(node) | Node::MdxTextExpression(node) => {
node.position.as_ref()
}
Node::MdxjsEsm(node) => node.position.as_ref(),
}
}
}