1use crate::error::Error;
2use alloc::borrow::ToOwned;
3use alloc::boxed::Box;
4use alloc::string::String;
5use core::fmt::{self, Debug, Display};
6use core::mem;
7use serde::de::value::BorrowedStrDeserializer;
8use serde::de::{
9 self, Deserialize, DeserializeSeed, Deserializer, IntoDeserializer, MapAccess, Unexpected,
10 Visitor,
11};
12use serde::forward_to_deserialize_any;
13use serde::ser::{Serialize, SerializeStruct, Serializer};
14
15#[cfg_attr(not(doc), repr(transparent))]
116#[cfg_attr(docsrs, doc(cfg(feature = "raw_value")))]
117pub struct RawValue {
118 json: str,
119}
120
121impl RawValue {
122 fn from_borrowed(json: &str) -> &Self {
123 unsafe { mem::transmute::<&str, &RawValue>(json) }
124 }
125
126 fn from_owned(json: Box<str>) -> Box<Self> {
127 unsafe { mem::transmute::<Box<str>, Box<RawValue>>(json) }
128 }
129
130 fn into_owned(raw_value: Box<Self>) -> Box<str> {
131 unsafe { mem::transmute::<Box<RawValue>, Box<str>>(raw_value) }
132 }
133}
134
135impl Clone for Box<RawValue> {
136 fn clone(&self) -> Self {
137 (**self).to_owned()
138 }
139}
140
141impl ToOwned for RawValue {
142 type Owned = Box<RawValue>;
143
144 fn to_owned(&self) -> Self::Owned {
145 RawValue::from_owned(self.json.to_owned().into_boxed_str())
146 }
147}
148
149impl Default for Box<RawValue> {
150 fn default() -> Self {
151 RawValue::from_borrowed("null").to_owned()
152 }
153}
154
155impl Debug for RawValue {
156 fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
157 formatter
158 .debug_tuple("RawValue")
159 .field(&format_args!("{}", &self.json))
160 .finish()
161 }
162}
163
164impl Display for RawValue {
165 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
166 f.write_str(&self.json)
167 }
168}
169
170impl RawValue {
171 pub fn from_string(json: String) -> Result<Box<Self>, Error> {
180 {
181 let borrowed = crate::from_str::<&Self>(&json)?;
182 if borrowed.json.len() < json.len() {
183 return Ok(borrowed.to_owned());
184 }
185 }
186 Ok(Self::from_owned(json.into_boxed_str()))
187 }
188
189 pub fn get(&self) -> &str {
223 &self.json
224 }
225}
226
227impl From<Box<RawValue>> for Box<str> {
228 fn from(raw_value: Box<RawValue>) -> Self {
229 RawValue::into_owned(raw_value)
230 }
231}
232
233#[cfg_attr(docsrs, doc(cfg(feature = "raw_value")))]
286pub fn to_raw_value<T>(value: &T) -> Result<Box<RawValue>, Error>
287where
288 T: ?Sized + Serialize,
289{
290 let json_string = crate::to_string(value)?;
291 Ok(RawValue::from_owned(json_string.into_boxed_str()))
292}
293
294pub const TOKEN: &str = "$serde_json::private::RawValue";
295
296impl Serialize for RawValue {
297 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
298 where
299 S: Serializer,
300 {
301 let mut s = serializer.serialize_struct(TOKEN, 1)?;
302 s.serialize_field(TOKEN, &self.json)?;
303 s.end()
304 }
305}
306
307impl<'de: 'a, 'a> Deserialize<'de> for &'a RawValue {
308 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
309 where
310 D: Deserializer<'de>,
311 {
312 struct ReferenceVisitor;
313
314 impl<'de> Visitor<'de> for ReferenceVisitor {
315 type Value = &'de RawValue;
316
317 fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
318 write!(formatter, "any valid JSON value")
319 }
320
321 fn visit_map<V>(self, mut visitor: V) -> Result<Self::Value, V::Error>
322 where
323 V: MapAccess<'de>,
324 {
325 let value = visitor.next_key::<RawKey>()?;
326 if value.is_none() {
327 return Err(de::Error::invalid_type(Unexpected::Map, &self));
328 }
329 visitor.next_value_seed(ReferenceFromString)
330 }
331 }
332
333 deserializer.deserialize_newtype_struct(TOKEN, ReferenceVisitor)
334 }
335}
336
337impl<'de> Deserialize<'de> for Box<RawValue> {
338 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
339 where
340 D: Deserializer<'de>,
341 {
342 struct BoxedVisitor;
343
344 impl<'de> Visitor<'de> for BoxedVisitor {
345 type Value = Box<RawValue>;
346
347 fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
348 write!(formatter, "any valid JSON value")
349 }
350
351 fn visit_map<V>(self, mut visitor: V) -> Result<Self::Value, V::Error>
352 where
353 V: MapAccess<'de>,
354 {
355 let value = visitor.next_key::<RawKey>()?;
356 if value.is_none() {
357 return Err(de::Error::invalid_type(Unexpected::Map, &self));
358 }
359 visitor.next_value_seed(BoxedFromString)
360 }
361 }
362
363 deserializer.deserialize_newtype_struct(TOKEN, BoxedVisitor)
364 }
365}
366
367struct RawKey;
368
369impl<'de> Deserialize<'de> for RawKey {
370 fn deserialize<D>(deserializer: D) -> Result<RawKey, D::Error>
371 where
372 D: Deserializer<'de>,
373 {
374 struct FieldVisitor;
375
376 impl<'de> Visitor<'de> for FieldVisitor {
377 type Value = ();
378
379 fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
380 formatter.write_str("raw value")
381 }
382
383 fn visit_str<E>(self, s: &str) -> Result<(), E>
384 where
385 E: de::Error,
386 {
387 if s == TOKEN {
388 Ok(())
389 } else {
390 Err(de::Error::custom("unexpected raw value"))
391 }
392 }
393 }
394
395 deserializer.deserialize_identifier(FieldVisitor)?;
396 Ok(RawKey)
397 }
398}
399
400pub struct ReferenceFromString;
401
402impl<'de> DeserializeSeed<'de> for ReferenceFromString {
403 type Value = &'de RawValue;
404
405 fn deserialize<D>(self, deserializer: D) -> Result<Self::Value, D::Error>
406 where
407 D: Deserializer<'de>,
408 {
409 deserializer.deserialize_str(self)
410 }
411}
412
413impl<'de> Visitor<'de> for ReferenceFromString {
414 type Value = &'de RawValue;
415
416 fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
417 formatter.write_str("raw value")
418 }
419
420 fn visit_borrowed_str<E>(self, s: &'de str) -> Result<Self::Value, E>
421 where
422 E: de::Error,
423 {
424 Ok(RawValue::from_borrowed(s))
425 }
426}
427
428pub struct BoxedFromString;
429
430impl<'de> DeserializeSeed<'de> for BoxedFromString {
431 type Value = Box<RawValue>;
432
433 fn deserialize<D>(self, deserializer: D) -> Result<Self::Value, D::Error>
434 where
435 D: Deserializer<'de>,
436 {
437 deserializer.deserialize_str(self)
438 }
439}
440
441impl<'de> Visitor<'de> for BoxedFromString {
442 type Value = Box<RawValue>;
443
444 fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
445 formatter.write_str("raw value")
446 }
447
448 fn visit_str<E>(self, s: &str) -> Result<Self::Value, E>
449 where
450 E: de::Error,
451 {
452 Ok(RawValue::from_owned(s.to_owned().into_boxed_str()))
453 }
454
455 #[cfg(any(feature = "std", feature = "alloc"))]
456 fn visit_string<E>(self, s: String) -> Result<Self::Value, E>
457 where
458 E: de::Error,
459 {
460 Ok(RawValue::from_owned(s.into_boxed_str()))
461 }
462}
463
464struct RawKeyDeserializer;
465
466impl<'de> Deserializer<'de> for RawKeyDeserializer {
467 type Error = Error;
468
469 fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Error>
470 where
471 V: de::Visitor<'de>,
472 {
473 visitor.visit_borrowed_str(TOKEN)
474 }
475
476 forward_to_deserialize_any! {
477 bool u8 u16 u32 u64 u128 i8 i16 i32 i64 i128 f32 f64 char str string seq
478 bytes byte_buf map struct option unit newtype_struct ignored_any
479 unit_struct tuple_struct tuple enum identifier
480 }
481}
482
483pub struct OwnedRawDeserializer {
484 pub raw_value: Option<String>,
485}
486
487impl<'de> MapAccess<'de> for OwnedRawDeserializer {
488 type Error = Error;
489
490 fn next_key_seed<K>(&mut self, seed: K) -> Result<Option<K::Value>, Error>
491 where
492 K: de::DeserializeSeed<'de>,
493 {
494 if self.raw_value.is_none() {
495 return Ok(None);
496 }
497 seed.deserialize(RawKeyDeserializer).map(Some)
498 }
499
500 fn next_value_seed<V>(&mut self, seed: V) -> Result<V::Value, Error>
501 where
502 V: de::DeserializeSeed<'de>,
503 {
504 seed.deserialize(self.raw_value.take().unwrap().into_deserializer())
505 }
506}
507
508pub struct BorrowedRawDeserializer<'de> {
509 pub raw_value: Option<&'de str>,
510}
511
512impl<'de> MapAccess<'de> for BorrowedRawDeserializer<'de> {
513 type Error = Error;
514
515 fn next_key_seed<K>(&mut self, seed: K) -> Result<Option<K::Value>, Error>
516 where
517 K: de::DeserializeSeed<'de>,
518 {
519 if self.raw_value.is_none() {
520 return Ok(None);
521 }
522 seed.deserialize(RawKeyDeserializer).map(Some)
523 }
524
525 fn next_value_seed<V>(&mut self, seed: V) -> Result<V::Value, Error>
526 where
527 V: de::DeserializeSeed<'de>,
528 {
529 seed.deserialize(BorrowedStrDeserializer::new(self.raw_value.take().unwrap()))
530 }
531}