#![allow(dead_code, unused_imports, non_camel_case_types)]
#![allow(missing_docs, rustdoc::missing_crate_level_docs)]
#![allow(clippy::unnecessary_cast)]
#![doc = include_str!("readme.md")]
mod parse_ast;
mod parse_cst;
use core::str::FromStr;
use std::{borrow::Cow, ops::Range, sync::OnceLock};
use yggdrasil_rt::*;
type Input<'i> = Box<State<'i, Json5Rule>>;
type Output<'i> = Result<Box<State<'i, Json5Rule>>, Box<State<'i, Json5Rule>>>;
#[doc = include_str!("railway.min.svg")]
#[repr(C)]
#[derive(Copy, Clone, Debug, Default, PartialEq, Eq, Ord, PartialOrd, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct Json5Parser {}
impl YggdrasilParser for Json5Parser {
type Rule = Json5Rule;
fn parse_cst(input: &str, rule: Self::Rule) -> OutputResult<Json5Rule> {
self::parse_cst::parse_cst(input, rule)
}
}
#[repr(u32)]
#[derive(Copy, Clone, Debug, PartialEq, Eq, Ord, PartialOrd, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum Json5Rule {
Value,
Object,
ObjectPair,
ObjectKey,
Array,
String,
StringElement,
HexDigit,
Escaped,
StringText,
Number,
Boolean,
Null,
Identifier,
COLON,
COMMA,
Comment,
WhiteSpace,
HiddenText,
}
impl YggdrasilRule for Json5Rule {
fn is_ignore(&self) -> bool {
matches!(self, Self::HiddenText | Self::Comment | Self::WhiteSpace)
}
fn get_style(&self) -> &'static str {
match self {
Self::Value => "",
Self::Object => "",
Self::ObjectPair => "",
Self::ObjectKey => "",
Self::Array => "",
Self::String => "",
Self::StringElement => "",
Self::HexDigit => "",
Self::Escaped => "",
Self::StringText => "",
Self::Number => "",
Self::Boolean => "",
Self::Null => "",
Self::Identifier => "",
Self::COLON => "",
Self::COMMA => "",
Self::Comment => "",
Self::WhiteSpace => "",
_ => "",
}
}
}
#[derive(Clone, Debug, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum ValueNode {
Array(ArrayNode),
Boolean(BooleanNode),
Null(NullNode),
Number(NumberNode),
Object(ObjectNode),
String(StringNode),
}
#[derive(Clone, Debug, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct ObjectNode {
pub comma: Vec<CommaNode>,
pub object_pair: Vec<ObjectPairNode>,
pub span: Range<usize>,
}
#[derive(Clone, Debug, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct ObjectPairNode {
pub colon: ColonNode,
pub object_key: ObjectKeyNode,
pub value: ValueNode,
pub span: Range<usize>,
}
#[derive(Clone, Debug, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum ObjectKeyNode {
Identifier(IdentifierNode),
String(StringNode),
}
#[derive(Clone, Debug, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct ArrayNode {
pub comma: Vec<CommaNode>,
pub value: Vec<ValueNode>,
pub span: Range<usize>,
}
#[derive(Clone, Debug, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct StringNode {
pub string_element: Vec<StringElementNode>,
pub span: Range<usize>,
}
#[derive(Clone, Debug, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum StringElementNode {
Escaped(EscapedNode),
HexDigit(HexDigitNode),
StringText(StringTextNode),
}
#[derive(Clone, Debug, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct HexDigitNode {
pub text: String,
pub span: Range<usize>,
}
#[derive(Clone, Debug, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct EscapedNode {
pub text: String,
pub span: Range<usize>,
}
#[derive(Clone, Debug, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct StringTextNode {
pub text: String,
pub span: Range<usize>,
}
#[derive(Clone, Debug, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct NumberNode {
pub text: String,
pub span: Range<usize>,
}
#[derive(Clone, Debug, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum BooleanNode {
False,
True,
}
#[derive(Clone, Debug, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct NullNode {
pub span: Range<usize>,
}
#[derive(Clone, Debug, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct IdentifierNode {
pub span: Range<usize>,
}
#[derive(Clone, Debug, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct ColonNode {
pub span: Range<usize>,
}
#[derive(Clone, Debug, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct CommaNode {
pub span: Range<usize>,
}
#[derive(Clone, Debug, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct CommentNode {
pub span: Range<usize>,
}
#[derive(Clone, Debug, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct WhiteSpaceNode {
pub span: Range<usize>,
}