1use std::fmt;
2
3use crate::error::{Error, Result};
4use crate::number::Number;
5use crate::options::RenderOptions;
6use crate::parse::ParseOptions;
7use crate::render::Renderer;
8
9#[derive(Clone, Debug, PartialEq, Eq)]
15pub struct Entry {
16 pub key: String,
17 pub value: Value,
18}
19
20#[derive(Clone, Debug, PartialEq, Eq)]
26pub enum Value {
27 Null,
29 Bool(bool),
31 Number(Number),
33 String(String),
35 Array(Vec<Value>),
37 Object(Vec<Entry>),
39}
40
41#[cfg(feature = "serde_json")]
42impl From<serde_json::Value> for Value {
43 fn from(value: serde_json::Value) -> Self {
44 Self::from_serde_json(value)
45 }
46}
47
48#[cfg(feature = "serde_json")]
49impl From<Value> for serde_json::Value {
50 fn from(value: Value) -> Self {
51 value.to_serde_json()
52 }
53}
54
55impl Value {
56 pub(crate) fn from_serde_json(value: serde_json::Value) -> Self {
59 match value {
60 serde_json::Value::Null => Self::Null,
61 serde_json::Value::Bool(v) => Self::Bool(v),
62 serde_json::Value::Number(n) => Self::Number(Number(n.to_string())),
63 serde_json::Value::String(s) => Self::String(s),
64 serde_json::Value::Array(values) => {
65 Self::Array(values.into_iter().map(Self::from_serde_json).collect())
66 }
67 serde_json::Value::Object(map) => Self::Object(
68 map.into_iter()
69 .map(|(key, value)| Entry { key, value: Self::from_serde_json(value) })
70 .collect(),
71 ),
72 }
73 }
74
75 pub(crate) fn to_serde_json(&self) -> serde_json::Value {
76 match self {
77 Self::Null => serde_json::Value::Null,
78 Self::Bool(v) => serde_json::Value::Bool(*v),
79 Self::Number(n) => serde_json::Value::Number(n.to_serde_json_number()),
80 Self::String(s) => serde_json::Value::String(s.clone()),
81 Self::Array(values) => {
82 serde_json::Value::Array(values.iter().map(Value::to_serde_json).collect())
83 }
84 Self::Object(entries) => {
85 let mut map = serde_json::Map::new();
86 for Entry { key, value } in entries {
87 map.insert(key.clone(), value.to_serde_json());
88 }
89 serde_json::Value::Object(map)
90 }
91 }
92 }
93
94 pub(crate) fn parse_with(input: &str, options: ParseOptions) -> Result<Self> {
95 crate::parse::Parser::parse_document(input, options.start_indent).map_err(Error::Parse)
96 }
97
98 pub fn to_tjson_with(&self, options: RenderOptions) -> String {
108 Renderer::render(self, &options).expect("render is infallible")
109 }
110
111 pub fn to_json(&self) -> String {
120 let mut out = String::new();
121 write_json(self, &mut out);
122 out
123 }
124}
125
126fn write_json(value: &Value, out: &mut String) {
127 match value {
128 Value::Null => out.push_str("null"),
129 Value::Bool(b) => out.push_str(if *b { "true" } else { "false" }),
130 Value::Number(n) => out.push_str(&n.to_string()),
131 Value::String(s) => {
132 out.push_str(&serde_json::to_string(s).expect("string serialization is infallible"))
134 }
135 Value::Array(values) => {
136 out.push('[');
137 for (i, v) in values.iter().enumerate() {
138 if i > 0 { out.push(','); }
139 write_json(v, out);
140 }
141 out.push(']');
142 }
143 Value::Object(entries) => {
144 out.push('{');
145 for (i, Entry { key, value }) in entries.iter().enumerate() {
146 if i > 0 { out.push(','); }
147 out.push_str(&serde_json::to_string(key).expect("string serialization is infallible"));
148 out.push(':');
149 write_json(value, out);
150 }
151 out.push('}');
152 }
153 }
154}
155
156impl serde::Serialize for Value {
157 fn serialize<S: serde::Serializer>(&self, serializer: S) -> std::result::Result<S::Ok, S::Error> {
158 use serde::ser::{SerializeMap, SerializeSeq};
159 match self {
160 Self::Null => serializer.serialize_unit(),
161 Self::Bool(b) => serializer.serialize_bool(*b),
162 Self::Number(n) => serde::Serialize::serialize(n, serializer),
163 Self::String(s) => serializer.serialize_str(s),
164 Self::Array(values) => {
165 let mut seq = serializer.serialize_seq(Some(values.len()))?;
166 for v in values {
167 seq.serialize_element(v)?;
168 }
169 seq.end()
170 }
171 Self::Object(entries) => {
172 let mut map = serializer.serialize_map(Some(entries.len()))?;
173 for Entry { key, value } in entries {
174 map.serialize_entry(key, value)?;
175 }
176 map.end()
177 }
178 }
179 }
180}
181
182impl fmt::Display for Value {
183 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
184 f.write_str(&self.to_tjson_with(RenderOptions::default()))
185 }
186}
187
188impl std::str::FromStr for Value {
193 type Err = Error;
194
195 fn from_str(s: &str) -> Result<Self> {
196 Self::parse_with(s, ParseOptions::default())
197 }
198}