jsxn/
jsxn.rs

1use crate::{json, jsx, shared::sp};
2use nom::{
3    branch::alt,
4    combinator::{map, opt},
5    error::ParseError,
6    sequence::delimited,
7    IResult,
8};
9use serde::{Serialize, Serializer};
10
11/// A JSXN value
12#[derive(Debug, PartialEq, Clone)]
13pub enum JsxnValue {
14    /// A JSX value
15    JsxValue(jsx::JsxValue),
16
17    /// A JSON value
18    JsonValue(json::JsonValue),
19}
20
21impl Serialize for JsxnValue {
22    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
23    where
24        S: Serializer,
25    {
26        match self {
27            JsxnValue::JsxValue(json_value) => json_value.serialize(serializer),
28            JsxnValue::JsonValue(jsx_value) => jsx_value.serialize(serializer),
29        }
30    }
31}
32
33/// The root JSX or JSON of a JSXN tree
34pub fn root<'a, E: ParseError<&'a str>>(i: &'a str) -> IResult<&'a str, JsxnValue, E> {
35    delimited(
36        sp,
37        alt((
38            map(json::root, JsxnValue::JsonValue),
39            map(jsx::root, JsxnValue::JsxValue),
40        )),
41        opt(sp),
42    )(i)
43}