lib/grammar/ast/literal.rs
1use pest::iterators::Pair;
2use serde::ser::{Serialize, Serializer};
3use serde::Serialize as SerializeDerive;
4
5// use crate::grammar::ast::string::String;
6use crate::grammar::parser::Rule;
7
8#[derive(Debug, Clone, Eq, PartialEq, SerializeDerive)]
9#[serde(untagged)]
10pub enum LiteralTypes {
11 Array(Vec<Literal>),
12 String(String),
13 Boolean(bool),
14 Number(usize),
15}
16
17#[derive(Debug, Clone, Eq, PartialEq)]
18pub struct Literal {
19 pub inner: LiteralTypes,
20}
21
22impl Default for Literal {
23 fn default() -> Self {
24 Self {
25 inner: LiteralTypes::String(String::default()),
26 }
27 }
28}
29
30impl Serialize for Literal {
31 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
32 where
33 S: Serializer,
34 {
35 self.inner.serialize(serializer)
36 }
37}
38
39impl<'r> From<Pair<'r, Rule>> for Literal {
40 fn from(pair: Pair<'r, Rule>) -> Self {
41 let inner = match pair.as_rule() {
42 Rule::r#true | Rule::r#false => {
43 let span = pair.as_span().as_str();
44
45 match span.parse::<bool>() {
46 Ok(v) => LiteralTypes::Boolean(v),
47 Err(_) => {
48 unreachable!("Could not parse string to boolean")
49 }
50 }
51 }
52 Rule::number => {
53 let span = pair.as_span().as_str();
54
55 match span.parse::<u32>() {
56 Ok(n) => LiteralTypes::Number(n as usize),
57 Err(e) => {
58 unreachable!("Could not parse string to number: {:?}", e)
59 }
60 }
61 }
62 Rule::string | Rule::multi_line_string => {
63 let inner = pair.into_inner().next().unwrap().as_span().as_str();
64 LiteralTypes::String(String::from(inner))
65 }
66 Rule::array => {
67 let mut result = Vec::new();
68
69 for p in pair.clone().into_inner() {
70 result.push(Literal::from(p));
71 }
72
73 LiteralTypes::Array(result)
74 }
75 _ => {
76 unreachable!("Unexpected {:?} literal type", pair.as_rule())
77 }
78 };
79
80 Self { inner }
81 }
82}
83
84impl Literal {
85 pub fn inner(&self) -> LiteralTypes {
86 self.inner.clone()
87 }
88}
89
90// impl Serialize for Literal {
91// fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
92// where
93// S: Serializer,
94// {
95// match &self.inner {
96// LiteralTypes::Array(a) => {
97// let mut seq = serializer.serialize_seq(Some(a.len()))?;
98// for e in a {
99// seq.serialize_element(e)?;
100// }
101// seq.end()
102// }
103// LiteralTypes::String(s) => serializer.serialize_str(s),
104// LiteralTypes::Boolean(_) => serializer.serialize_str("hello"),
105// LiteralTypes::Number(_) => serializer.serialize_str("hello"),
106// }
107
108// let mut map = serializer.serialize_map(Some(1))?;
109// map.serialize_entry("type", "string")?;
110// map.serialize_entry("value", &self.inner)?;
111// map.end()
112
113// serializer.serialize_i32(40)
114// seq.serialize_element(e)
115// serializer.serialize_str("hello")
116// }
117// }
118
119// impl Serialize for LiteralTypes {
120// fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
121// where
122// S: Serializer,
123// {
124// match &self {
125// LiteralTypes::Array(a) => {
126// let mut seq = serializer.serialize_seq(Some(a.len()))?;
127// for e in a {
128// seq.serialize_element(e)?;
129// }
130// seq.end()
131// }
132// LiteralTypes::String(s) => serializer.serialize_str(s),
133// LiteralTypes::Boolean(_) => serializer.serialize_str("hello"),
134// LiteralTypes::Number(_) => serializer.serialize_str("hello"),
135// }
136
137// // serializer.serialize_i32(40)
138// // let mut map = serializer.serialize_map(Some(1))?;
139// // map.serialize_entry("type", "string")?;
140// // map.serialize_entry("value", &self)?;
141// // map.end()
142// }
143// }