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(docsrs, doc(cfg(feature = "raw_value")))]
116#[repr(transparent)]
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 let borrowed = tri!(crate::from_str::<&Self>(&json));
181 if borrowed.json.len() < json.len() {
182 return Ok(borrowed.to_owned());
183 }
184 Ok(Self::from_owned(json.into_boxed_str()))
185 }
186
187 pub fn get(&self) -> &str {
221 &self.json
222 }
223}
224
225impl From<Box<RawValue>> for Box<str> {
226 fn from(raw_value: Box<RawValue>) -> Self {
227 RawValue::into_owned(raw_value)
228 }
229}
230
231#[cfg_attr(docsrs, doc(cfg(feature = "raw_value")))]
284pub fn to_raw_value<T>(value: &T) -> Result<Box<RawValue>, Error>
285where
286 T: ?Sized + Serialize,
287{
288 let json_string = tri!(crate::to_string(value));
289 Ok(RawValue::from_owned(json_string.into_boxed_str()))
290}
291
292pub const TOKEN: &str = "$serde_json::private::RawValue";
293
294impl Serialize for RawValue {
295 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
296 where
297 S: Serializer,
298 {
299 let mut s = tri!(serializer.serialize_struct(TOKEN, 1));
300 tri!(s.serialize_field(TOKEN, &self.json));
301 s.end()
302 }
303}
304
305impl<'de: 'a, 'a> Deserialize<'de> for &'a RawValue {
306 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
307 where
308 D: Deserializer<'de>,
309 {
310 struct ReferenceVisitor;
311
312 impl<'de> Visitor<'de> for ReferenceVisitor {
313 type Value = &'de RawValue;
314
315 fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
316 write!(formatter, "any valid JSON value")
317 }
318
319 fn visit_map<V>(self, mut visitor: V) -> Result<Self::Value, V::Error>
320 where
321 V: MapAccess<'de>,
322 {
323 let value = tri!(visitor.next_key::<RawKey>());
324 if value.is_none() {
325 return Err(de::Error::invalid_type(Unexpected::Map, &self));
326 }
327 visitor.next_value_seed(ReferenceFromString)
328 }
329 }
330
331 deserializer.deserialize_newtype_struct(TOKEN, ReferenceVisitor)
332 }
333}
334
335impl<'de> Deserialize<'de> for Box<RawValue> {
336 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
337 where
338 D: Deserializer<'de>,
339 {
340 struct BoxedVisitor;
341
342 impl<'de> Visitor<'de> for BoxedVisitor {
343 type Value = Box<RawValue>;
344
345 fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
346 write!(formatter, "any valid JSON value")
347 }
348
349 fn visit_map<V>(self, mut visitor: V) -> Result<Self::Value, V::Error>
350 where
351 V: MapAccess<'de>,
352 {
353 let value = tri!(visitor.next_key::<RawKey>());
354 if value.is_none() {
355 return Err(de::Error::invalid_type(Unexpected::Map, &self));
356 }
357 visitor.next_value_seed(BoxedFromString)
358 }
359 }
360
361 deserializer.deserialize_newtype_struct(TOKEN, BoxedVisitor)
362 }
363}
364
365struct RawKey;
366
367impl<'de> Deserialize<'de> for RawKey {
368 fn deserialize<D>(deserializer: D) -> Result<RawKey, D::Error>
369 where
370 D: Deserializer<'de>,
371 {
372 struct FieldVisitor;
373
374 impl<'de> Visitor<'de> for FieldVisitor {
375 type Value = ();
376
377 fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
378 formatter.write_str("raw value")
379 }
380
381 fn visit_str<E>(self, s: &str) -> Result<(), E>
382 where
383 E: de::Error,
384 {
385 if s == TOKEN {
386 Ok(())
387 } else {
388 Err(de::Error::custom("unexpected raw value"))
389 }
390 }
391 }
392
393 tri!(deserializer.deserialize_identifier(FieldVisitor));
394 Ok(RawKey)
395 }
396}
397
398pub struct ReferenceFromString;
399
400impl<'de> DeserializeSeed<'de> for ReferenceFromString {
401 type Value = &'de RawValue;
402
403 fn deserialize<D>(self, deserializer: D) -> Result<Self::Value, D::Error>
404 where
405 D: Deserializer<'de>,
406 {
407 deserializer.deserialize_str(self)
408 }
409}
410
411impl<'de> Visitor<'de> for ReferenceFromString {
412 type Value = &'de RawValue;
413
414 fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
415 formatter.write_str("raw value")
416 }
417
418 fn visit_borrowed_str<E>(self, s: &'de str) -> Result<Self::Value, E>
419 where
420 E: de::Error,
421 {
422 Ok(RawValue::from_borrowed(s))
423 }
424}
425
426pub struct BoxedFromString;
427
428impl<'de> DeserializeSeed<'de> for BoxedFromString {
429 type Value = Box<RawValue>;
430
431 fn deserialize<D>(self, deserializer: D) -> Result<Self::Value, D::Error>
432 where
433 D: Deserializer<'de>,
434 {
435 deserializer.deserialize_str(self)
436 }
437}
438
439impl<'de> Visitor<'de> for BoxedFromString {
440 type Value = Box<RawValue>;
441
442 fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
443 formatter.write_str("raw value")
444 }
445
446 fn visit_str<E>(self, s: &str) -> Result<Self::Value, E>
447 where
448 E: de::Error,
449 {
450 Ok(RawValue::from_owned(s.to_owned().into_boxed_str()))
451 }
452
453 #[cfg(any(feature = "std", feature = "alloc"))]
454 fn visit_string<E>(self, s: String) -> Result<Self::Value, E>
455 where
456 E: de::Error,
457 {
458 Ok(RawValue::from_owned(s.into_boxed_str()))
459 }
460}
461
462struct RawKeyDeserializer;
463
464impl<'de> Deserializer<'de> for RawKeyDeserializer {
465 type Error = Error;
466
467 fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Error>
468 where
469 V: de::Visitor<'de>,
470 {
471 visitor.visit_borrowed_str(TOKEN)
472 }
473
474 forward_to_deserialize_any! {
475 bool u8 u16 u32 u64 u128 i8 i16 i32 i64 i128 f32 f64 char str string seq
476 bytes byte_buf map struct option unit newtype_struct ignored_any
477 unit_struct tuple_struct tuple enum identifier
478 }
479}
480
481pub struct OwnedRawDeserializer {
482 pub raw_value: Option<String>,
483}
484
485impl<'de> MapAccess<'de> for OwnedRawDeserializer {
486 type Error = Error;
487
488 fn next_key_seed<K>(&mut self, seed: K) -> Result<Option<K::Value>, Error>
489 where
490 K: de::DeserializeSeed<'de>,
491 {
492 if self.raw_value.is_none() {
493 return Ok(None);
494 }
495 seed.deserialize(RawKeyDeserializer).map(Some)
496 }
497
498 fn next_value_seed<V>(&mut self, seed: V) -> Result<V::Value, Error>
499 where
500 V: de::DeserializeSeed<'de>,
501 {
502 seed.deserialize(self.raw_value.take().unwrap().into_deserializer())
503 }
504}
505
506pub struct BorrowedRawDeserializer<'de> {
507 pub raw_value: Option<&'de str>,
508}
509
510impl<'de> MapAccess<'de> for BorrowedRawDeserializer<'de> {
511 type Error = Error;
512
513 fn next_key_seed<K>(&mut self, seed: K) -> Result<Option<K::Value>, Error>
514 where
515 K: de::DeserializeSeed<'de>,
516 {
517 if self.raw_value.is_none() {
518 return Ok(None);
519 }
520 seed.deserialize(RawKeyDeserializer).map(Some)
521 }
522
523 fn next_value_seed<V>(&mut self, seed: V) -> Result<V::Value, Error>
524 where
525 V: de::DeserializeSeed<'de>,
526 {
527 seed.deserialize(BorrowedStrDeserializer::new(self.raw_value.take().unwrap()))
528 }
529}
530
531impl<'de> IntoDeserializer<'de, Error> for &'de RawValue {
532 type Deserializer = &'de RawValue;
533
534 fn into_deserializer(self) -> Self::Deserializer {
535 self
536 }
537}
538
539impl<'de> Deserializer<'de> for &'de RawValue {
540 type Error = Error;
541
542 fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Error>
543 where
544 V: Visitor<'de>,
545 {
546 crate::Deserializer::from_str(&self.json).deserialize_any(visitor)
547 }
548
549 fn deserialize_bool<V>(self, visitor: V) -> Result<V::Value, Error>
550 where
551 V: Visitor<'de>,
552 {
553 crate::Deserializer::from_str(&self.json).deserialize_bool(visitor)
554 }
555
556 fn deserialize_i8<V>(self, visitor: V) -> Result<V::Value, Error>
557 where
558 V: Visitor<'de>,
559 {
560 crate::Deserializer::from_str(&self.json).deserialize_i8(visitor)
561 }
562
563 fn deserialize_i16<V>(self, visitor: V) -> Result<V::Value, Error>
564 where
565 V: Visitor<'de>,
566 {
567 crate::Deserializer::from_str(&self.json).deserialize_i16(visitor)
568 }
569
570 fn deserialize_i32<V>(self, visitor: V) -> Result<V::Value, Error>
571 where
572 V: Visitor<'de>,
573 {
574 crate::Deserializer::from_str(&self.json).deserialize_i32(visitor)
575 }
576
577 fn deserialize_i64<V>(self, visitor: V) -> Result<V::Value, Error>
578 where
579 V: Visitor<'de>,
580 {
581 crate::Deserializer::from_str(&self.json).deserialize_i64(visitor)
582 }
583
584 fn deserialize_i128<V>(self, visitor: V) -> Result<V::Value, Error>
585 where
586 V: Visitor<'de>,
587 {
588 crate::Deserializer::from_str(&self.json).deserialize_i128(visitor)
589 }
590
591 fn deserialize_u8<V>(self, visitor: V) -> Result<V::Value, Error>
592 where
593 V: Visitor<'de>,
594 {
595 crate::Deserializer::from_str(&self.json).deserialize_u8(visitor)
596 }
597
598 fn deserialize_u16<V>(self, visitor: V) -> Result<V::Value, Error>
599 where
600 V: Visitor<'de>,
601 {
602 crate::Deserializer::from_str(&self.json).deserialize_u16(visitor)
603 }
604
605 fn deserialize_u32<V>(self, visitor: V) -> Result<V::Value, Error>
606 where
607 V: Visitor<'de>,
608 {
609 crate::Deserializer::from_str(&self.json).deserialize_u32(visitor)
610 }
611
612 fn deserialize_u64<V>(self, visitor: V) -> Result<V::Value, Error>
613 where
614 V: Visitor<'de>,
615 {
616 crate::Deserializer::from_str(&self.json).deserialize_u64(visitor)
617 }
618
619 fn deserialize_u128<V>(self, visitor: V) -> Result<V::Value, Error>
620 where
621 V: Visitor<'de>,
622 {
623 crate::Deserializer::from_str(&self.json).deserialize_u128(visitor)
624 }
625
626 fn deserialize_f32<V>(self, visitor: V) -> Result<V::Value, Error>
627 where
628 V: Visitor<'de>,
629 {
630 crate::Deserializer::from_str(&self.json).deserialize_f32(visitor)
631 }
632
633 fn deserialize_f64<V>(self, visitor: V) -> Result<V::Value, Error>
634 where
635 V: Visitor<'de>,
636 {
637 crate::Deserializer::from_str(&self.json).deserialize_f64(visitor)
638 }
639
640 fn deserialize_char<V>(self, visitor: V) -> Result<V::Value, Error>
641 where
642 V: Visitor<'de>,
643 {
644 crate::Deserializer::from_str(&self.json).deserialize_char(visitor)
645 }
646
647 fn deserialize_str<V>(self, visitor: V) -> Result<V::Value, Error>
648 where
649 V: Visitor<'de>,
650 {
651 crate::Deserializer::from_str(&self.json).deserialize_str(visitor)
652 }
653
654 fn deserialize_string<V>(self, visitor: V) -> Result<V::Value, Error>
655 where
656 V: Visitor<'de>,
657 {
658 crate::Deserializer::from_str(&self.json).deserialize_string(visitor)
659 }
660
661 fn deserialize_bytes<V>(self, visitor: V) -> Result<V::Value, Error>
662 where
663 V: Visitor<'de>,
664 {
665 crate::Deserializer::from_str(&self.json).deserialize_bytes(visitor)
666 }
667
668 fn deserialize_byte_buf<V>(self, visitor: V) -> Result<V::Value, Error>
669 where
670 V: Visitor<'de>,
671 {
672 crate::Deserializer::from_str(&self.json).deserialize_byte_buf(visitor)
673 }
674
675 fn deserialize_option<V>(self, visitor: V) -> Result<V::Value, Error>
676 where
677 V: Visitor<'de>,
678 {
679 crate::Deserializer::from_str(&self.json).deserialize_option(visitor)
680 }
681
682 fn deserialize_unit<V>(self, visitor: V) -> Result<V::Value, Error>
683 where
684 V: Visitor<'de>,
685 {
686 crate::Deserializer::from_str(&self.json).deserialize_unit(visitor)
687 }
688
689 fn deserialize_unit_struct<V>(self, name: &'static str, visitor: V) -> Result<V::Value, Error>
690 where
691 V: Visitor<'de>,
692 {
693 crate::Deserializer::from_str(&self.json).deserialize_unit_struct(name, visitor)
694 }
695
696 fn deserialize_newtype_struct<V>(
697 self,
698 name: &'static str,
699 visitor: V,
700 ) -> Result<V::Value, Error>
701 where
702 V: Visitor<'de>,
703 {
704 crate::Deserializer::from_str(&self.json).deserialize_newtype_struct(name, visitor)
705 }
706
707 fn deserialize_seq<V>(self, visitor: V) -> Result<V::Value, Error>
708 where
709 V: Visitor<'de>,
710 {
711 crate::Deserializer::from_str(&self.json).deserialize_seq(visitor)
712 }
713
714 fn deserialize_tuple<V>(self, len: usize, visitor: V) -> Result<V::Value, Error>
715 where
716 V: Visitor<'de>,
717 {
718 crate::Deserializer::from_str(&self.json).deserialize_tuple(len, visitor)
719 }
720
721 fn deserialize_tuple_struct<V>(
722 self,
723 name: &'static str,
724 len: usize,
725 visitor: V,
726 ) -> Result<V::Value, Error>
727 where
728 V: Visitor<'de>,
729 {
730 crate::Deserializer::from_str(&self.json).deserialize_tuple_struct(name, len, visitor)
731 }
732
733 fn deserialize_map<V>(self, visitor: V) -> Result<V::Value, Error>
734 where
735 V: Visitor<'de>,
736 {
737 crate::Deserializer::from_str(&self.json).deserialize_map(visitor)
738 }
739
740 fn deserialize_struct<V>(
741 self,
742 name: &'static str,
743 fields: &'static [&'static str],
744 visitor: V,
745 ) -> Result<V::Value, Error>
746 where
747 V: Visitor<'de>,
748 {
749 crate::Deserializer::from_str(&self.json).deserialize_struct(name, fields, visitor)
750 }
751
752 fn deserialize_enum<V>(
753 self,
754 name: &'static str,
755 variants: &'static [&'static str],
756 visitor: V,
757 ) -> Result<V::Value, Error>
758 where
759 V: Visitor<'de>,
760 {
761 crate::Deserializer::from_str(&self.json).deserialize_enum(name, variants, visitor)
762 }
763
764 fn deserialize_identifier<V>(self, visitor: V) -> Result<V::Value, Error>
765 where
766 V: Visitor<'de>,
767 {
768 crate::Deserializer::from_str(&self.json).deserialize_identifier(visitor)
769 }
770
771 fn deserialize_ignored_any<V>(self, visitor: V) -> Result<V::Value, Error>
772 where
773 V: Visitor<'de>,
774 {
775 crate::Deserializer::from_str(&self.json).deserialize_ignored_any(visitor)
776 }
777}