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 const 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::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!("{0}", &self.json)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 const NULL: &'static RawValue = RawValue::from_borrowed("null");
173 pub const TRUE: &'static RawValue = RawValue::from_borrowed("true");
175 pub const FALSE: &'static RawValue = RawValue::from_borrowed("false");
177
178 pub fn from_string(json: String) -> Result<Box<Self>, Error> {
187 let borrowed = match crate::from_str::<&Self>(&json) {
core::result::Result::Ok(val) => val,
core::result::Result::Err(err) => return core::result::Result::Err(err),
}tri!(crate::from_str::<&Self>(&json));
188 if borrowed.json.len() < json.len() {
189 return Ok(borrowed.to_owned());
190 }
191 Ok(Self::from_owned(json.into_boxed_str()))
192 }
193
194 pub unsafe fn from_string_unchecked(json: String) -> Box<Self> {
229 if true {
if !crate::from_str::<&Self>(&json).is_ok_and(|v|
v.json.len() == json.len()) {
{
::core::panicking::panic_fmt(format_args!("from_string_unchecked: input is not a single well-formed JSON value with no leading or trailing whitespace"));
}
};
};debug_assert!(
230 crate::from_str::<&Self>(&json).is_ok_and(|v| v.json.len() == json.len()),
231 "from_string_unchecked: input is not a single well-formed JSON value \
232 with no leading or trailing whitespace",
233 );
234 Self::from_owned(json.into_boxed_str())
235 }
236
237 pub fn get(&self) -> &str {
271 &self.json
272 }
273}
274
275impl From<Box<RawValue>> for Box<str> {
276 fn from(raw_value: Box<RawValue>) -> Self {
277 RawValue::into_owned(raw_value)
278 }
279}
280
281#[cfg_attr(docsrs, doc(cfg(feature = "raw_value")))]
334pub fn to_raw_value<T>(value: &T) -> Result<Box<RawValue>, Error>
335where
336 T: ?Sized + Serialize,
337{
338 let json_string = match crate::to_string(value) {
core::result::Result::Ok(val) => val,
core::result::Result::Err(err) => return core::result::Result::Err(err),
}tri!(crate::to_string(value));
339 Ok(RawValue::from_owned(json_string.into_boxed_str()))
340}
341
342pub const TOKEN: &str = "$serde_json::private::RawValue";
343
344impl Serialize for RawValue {
345 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
346 where
347 S: Serializer,
348 {
349 let mut s = match serializer.serialize_struct(TOKEN, 1) {
core::result::Result::Ok(val) => val,
core::result::Result::Err(err) => return core::result::Result::Err(err),
}tri!(serializer.serialize_struct(TOKEN, 1));
350 match s.serialize_field(TOKEN, &self.json) {
core::result::Result::Ok(val) => val,
core::result::Result::Err(err) => return core::result::Result::Err(err),
};tri!(s.serialize_field(TOKEN, &self.json));
351 s.end()
352 }
353}
354
355impl<'de: 'a, 'a> Deserialize<'de> for &'a RawValue {
356 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
357 where
358 D: Deserializer<'de>,
359 {
360 struct ReferenceVisitor;
361
362 impl<'de> Visitor<'de> for ReferenceVisitor {
363 type Value = &'de RawValue;
364
365 fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
366 formatter.write_fmt(format_args!("any valid JSON value"))write!(formatter, "any valid JSON value")
367 }
368
369 fn visit_map<V>(self, mut visitor: V) -> Result<Self::Value, V::Error>
370 where
371 V: MapAccess<'de>,
372 {
373 let value = match visitor.next_key::<RawKey>() {
core::result::Result::Ok(val) => val,
core::result::Result::Err(err) => return core::result::Result::Err(err),
}tri!(visitor.next_key::<RawKey>());
374 if value.is_none() {
375 return Err(de::Error::invalid_type(Unexpected::Map, &self));
376 }
377 visitor.next_value_seed(ReferenceFromString)
378 }
379 }
380
381 deserializer.deserialize_newtype_struct(TOKEN, ReferenceVisitor)
382 }
383}
384
385impl<'de> Deserialize<'de> for Box<RawValue> {
386 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
387 where
388 D: Deserializer<'de>,
389 {
390 struct BoxedVisitor;
391
392 impl<'de> Visitor<'de> for BoxedVisitor {
393 type Value = Box<RawValue>;
394
395 fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
396 formatter.write_fmt(format_args!("any valid JSON value"))write!(formatter, "any valid JSON value")
397 }
398
399 fn visit_map<V>(self, mut visitor: V) -> Result<Self::Value, V::Error>
400 where
401 V: MapAccess<'de>,
402 {
403 let value = match visitor.next_key::<RawKey>() {
core::result::Result::Ok(val) => val,
core::result::Result::Err(err) => return core::result::Result::Err(err),
}tri!(visitor.next_key::<RawKey>());
404 if value.is_none() {
405 return Err(de::Error::invalid_type(Unexpected::Map, &self));
406 }
407 visitor.next_value_seed(BoxedFromString)
408 }
409 }
410
411 deserializer.deserialize_newtype_struct(TOKEN, BoxedVisitor)
412 }
413}
414
415struct RawKey;
416
417impl<'de> Deserialize<'de> for RawKey {
418 fn deserialize<D>(deserializer: D) -> Result<RawKey, D::Error>
419 where
420 D: Deserializer<'de>,
421 {
422 struct FieldVisitor;
423
424 impl<'de> Visitor<'de> for FieldVisitor {
425 type Value = ();
426
427 fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
428 formatter.write_str("raw value")
429 }
430
431 fn visit_str<E>(self, s: &str) -> Result<(), E>
432 where
433 E: de::Error,
434 {
435 if s == TOKEN {
436 Ok(())
437 } else {
438 Err(de::Error::custom("unexpected raw value"))
439 }
440 }
441 }
442
443 match deserializer.deserialize_identifier(FieldVisitor) {
core::result::Result::Ok(val) => val,
core::result::Result::Err(err) => return core::result::Result::Err(err),
};tri!(deserializer.deserialize_identifier(FieldVisitor));
444 Ok(RawKey)
445 }
446}
447
448pub struct ReferenceFromString;
449
450impl<'de> DeserializeSeed<'de> for ReferenceFromString {
451 type Value = &'de RawValue;
452
453 fn deserialize<D>(self, deserializer: D) -> Result<Self::Value, D::Error>
454 where
455 D: Deserializer<'de>,
456 {
457 deserializer.deserialize_str(self)
458 }
459}
460
461impl<'de> Visitor<'de> for ReferenceFromString {
462 type Value = &'de RawValue;
463
464 fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
465 formatter.write_str("raw value")
466 }
467
468 fn visit_borrowed_str<E>(self, s: &'de str) -> Result<Self::Value, E>
469 where
470 E: de::Error,
471 {
472 Ok(RawValue::from_borrowed(s))
473 }
474}
475
476pub struct BoxedFromString;
477
478impl<'de> DeserializeSeed<'de> for BoxedFromString {
479 type Value = Box<RawValue>;
480
481 fn deserialize<D>(self, deserializer: D) -> Result<Self::Value, D::Error>
482 where
483 D: Deserializer<'de>,
484 {
485 deserializer.deserialize_str(self)
486 }
487}
488
489impl<'de> Visitor<'de> for BoxedFromString {
490 type Value = Box<RawValue>;
491
492 fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
493 formatter.write_str("raw value")
494 }
495
496 fn visit_str<E>(self, s: &str) -> Result<Self::Value, E>
497 where
498 E: de::Error,
499 {
500 Ok(RawValue::from_owned(s.to_owned().into_boxed_str()))
501 }
502
503 #[cfg(any(feature = "std", feature = "alloc"))]
504 fn visit_string<E>(self, s: String) -> Result<Self::Value, E>
505 where
506 E: de::Error,
507 {
508 Ok(RawValue::from_owned(s.into_boxed_str()))
509 }
510}
511
512struct RawKeyDeserializer;
513
514impl<'de> Deserializer<'de> for RawKeyDeserializer {
515 type Error = Error;
516
517 fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Error>
518 where
519 V: de::Visitor<'de>,
520 {
521 visitor.visit_borrowed_str(TOKEN)
522 }
523
524 #[inline]
fn deserialize_identifier<V>(self, visitor: V)
->
::serde_core::__private::Result<V::Value,
<Self as ::serde_core::de::Deserializer<'de>>::Error> where
V: ::serde_core::de::Visitor<'de> {
self.deserialize_any(visitor)
}forward_to_deserialize_any! {
525 bool u8 u16 u32 u64 u128 i8 i16 i32 i64 i128 f32 f64 char str string seq
526 bytes byte_buf map struct option unit newtype_struct ignored_any
527 unit_struct tuple_struct tuple enum identifier
528 }
529}
530
531pub struct OwnedRawDeserializer {
532 pub raw_value: Option<String>,
533}
534
535impl<'de> MapAccess<'de> for OwnedRawDeserializer {
536 type Error = Error;
537
538 fn next_key_seed<K>(&mut self, seed: K) -> Result<Option<K::Value>, Error>
539 where
540 K: de::DeserializeSeed<'de>,
541 {
542 if self.raw_value.is_none() {
543 return Ok(None);
544 }
545 seed.deserialize(RawKeyDeserializer).map(Some)
546 }
547
548 fn next_value_seed<V>(&mut self, seed: V) -> Result<V::Value, Error>
549 where
550 V: de::DeserializeSeed<'de>,
551 {
552 seed.deserialize(self.raw_value.take().unwrap().into_deserializer())
553 }
554}
555
556pub struct BorrowedRawDeserializer<'de> {
557 pub raw_value: Option<&'de str>,
558}
559
560impl<'de> MapAccess<'de> for BorrowedRawDeserializer<'de> {
561 type Error = Error;
562
563 fn next_key_seed<K>(&mut self, seed: K) -> Result<Option<K::Value>, Error>
564 where
565 K: de::DeserializeSeed<'de>,
566 {
567 if self.raw_value.is_none() {
568 return Ok(None);
569 }
570 seed.deserialize(RawKeyDeserializer).map(Some)
571 }
572
573 fn next_value_seed<V>(&mut self, seed: V) -> Result<V::Value, Error>
574 where
575 V: de::DeserializeSeed<'de>,
576 {
577 seed.deserialize(BorrowedStrDeserializer::new(self.raw_value.take().unwrap()))
578 }
579}
580
581impl<'de> IntoDeserializer<'de, Error> for &'de RawValue {
582 type Deserializer = &'de RawValue;
583
584 fn into_deserializer(self) -> Self::Deserializer {
585 self
586 }
587}
588
589impl<'de> Deserializer<'de> for &'de RawValue {
590 type Error = Error;
591
592 fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Error>
593 where
594 V: Visitor<'de>,
595 {
596 crate::Deserializer::from_str(&self.json).deserialize_any(visitor)
597 }
598
599 fn deserialize_bool<V>(self, visitor: V) -> Result<V::Value, Error>
600 where
601 V: Visitor<'de>,
602 {
603 crate::Deserializer::from_str(&self.json).deserialize_bool(visitor)
604 }
605
606 fn deserialize_i8<V>(self, visitor: V) -> Result<V::Value, Error>
607 where
608 V: Visitor<'de>,
609 {
610 crate::Deserializer::from_str(&self.json).deserialize_i8(visitor)
611 }
612
613 fn deserialize_i16<V>(self, visitor: V) -> Result<V::Value, Error>
614 where
615 V: Visitor<'de>,
616 {
617 crate::Deserializer::from_str(&self.json).deserialize_i16(visitor)
618 }
619
620 fn deserialize_i32<V>(self, visitor: V) -> Result<V::Value, Error>
621 where
622 V: Visitor<'de>,
623 {
624 crate::Deserializer::from_str(&self.json).deserialize_i32(visitor)
625 }
626
627 fn deserialize_i64<V>(self, visitor: V) -> Result<V::Value, Error>
628 where
629 V: Visitor<'de>,
630 {
631 crate::Deserializer::from_str(&self.json).deserialize_i64(visitor)
632 }
633
634 fn deserialize_i128<V>(self, visitor: V) -> Result<V::Value, Error>
635 where
636 V: Visitor<'de>,
637 {
638 crate::Deserializer::from_str(&self.json).deserialize_i128(visitor)
639 }
640
641 fn deserialize_u8<V>(self, visitor: V) -> Result<V::Value, Error>
642 where
643 V: Visitor<'de>,
644 {
645 crate::Deserializer::from_str(&self.json).deserialize_u8(visitor)
646 }
647
648 fn deserialize_u16<V>(self, visitor: V) -> Result<V::Value, Error>
649 where
650 V: Visitor<'de>,
651 {
652 crate::Deserializer::from_str(&self.json).deserialize_u16(visitor)
653 }
654
655 fn deserialize_u32<V>(self, visitor: V) -> Result<V::Value, Error>
656 where
657 V: Visitor<'de>,
658 {
659 crate::Deserializer::from_str(&self.json).deserialize_u32(visitor)
660 }
661
662 fn deserialize_u64<V>(self, visitor: V) -> Result<V::Value, Error>
663 where
664 V: Visitor<'de>,
665 {
666 crate::Deserializer::from_str(&self.json).deserialize_u64(visitor)
667 }
668
669 fn deserialize_u128<V>(self, visitor: V) -> Result<V::Value, Error>
670 where
671 V: Visitor<'de>,
672 {
673 crate::Deserializer::from_str(&self.json).deserialize_u128(visitor)
674 }
675
676 fn deserialize_f32<V>(self, visitor: V) -> Result<V::Value, Error>
677 where
678 V: Visitor<'de>,
679 {
680 crate::Deserializer::from_str(&self.json).deserialize_f32(visitor)
681 }
682
683 fn deserialize_f64<V>(self, visitor: V) -> Result<V::Value, Error>
684 where
685 V: Visitor<'de>,
686 {
687 crate::Deserializer::from_str(&self.json).deserialize_f64(visitor)
688 }
689
690 fn deserialize_char<V>(self, visitor: V) -> Result<V::Value, Error>
691 where
692 V: Visitor<'de>,
693 {
694 crate::Deserializer::from_str(&self.json).deserialize_char(visitor)
695 }
696
697 fn deserialize_str<V>(self, visitor: V) -> Result<V::Value, Error>
698 where
699 V: Visitor<'de>,
700 {
701 crate::Deserializer::from_str(&self.json).deserialize_str(visitor)
702 }
703
704 fn deserialize_string<V>(self, visitor: V) -> Result<V::Value, Error>
705 where
706 V: Visitor<'de>,
707 {
708 crate::Deserializer::from_str(&self.json).deserialize_string(visitor)
709 }
710
711 fn deserialize_bytes<V>(self, visitor: V) -> Result<V::Value, Error>
712 where
713 V: Visitor<'de>,
714 {
715 crate::Deserializer::from_str(&self.json).deserialize_bytes(visitor)
716 }
717
718 fn deserialize_byte_buf<V>(self, visitor: V) -> Result<V::Value, Error>
719 where
720 V: Visitor<'de>,
721 {
722 crate::Deserializer::from_str(&self.json).deserialize_byte_buf(visitor)
723 }
724
725 fn deserialize_option<V>(self, visitor: V) -> Result<V::Value, Error>
726 where
727 V: Visitor<'de>,
728 {
729 crate::Deserializer::from_str(&self.json).deserialize_option(visitor)
730 }
731
732 fn deserialize_unit<V>(self, visitor: V) -> Result<V::Value, Error>
733 where
734 V: Visitor<'de>,
735 {
736 crate::Deserializer::from_str(&self.json).deserialize_unit(visitor)
737 }
738
739 fn deserialize_unit_struct<V>(self, name: &'static str, visitor: V) -> Result<V::Value, Error>
740 where
741 V: Visitor<'de>,
742 {
743 crate::Deserializer::from_str(&self.json).deserialize_unit_struct(name, visitor)
744 }
745
746 fn deserialize_newtype_struct<V>(
747 self,
748 name: &'static str,
749 visitor: V,
750 ) -> Result<V::Value, Error>
751 where
752 V: Visitor<'de>,
753 {
754 crate::Deserializer::from_str(&self.json).deserialize_newtype_struct(name, visitor)
755 }
756
757 fn deserialize_seq<V>(self, visitor: V) -> Result<V::Value, Error>
758 where
759 V: Visitor<'de>,
760 {
761 crate::Deserializer::from_str(&self.json).deserialize_seq(visitor)
762 }
763
764 fn deserialize_tuple<V>(self, len: usize, visitor: V) -> Result<V::Value, Error>
765 where
766 V: Visitor<'de>,
767 {
768 crate::Deserializer::from_str(&self.json).deserialize_tuple(len, visitor)
769 }
770
771 fn deserialize_tuple_struct<V>(
772 self,
773 name: &'static str,
774 len: usize,
775 visitor: V,
776 ) -> Result<V::Value, Error>
777 where
778 V: Visitor<'de>,
779 {
780 crate::Deserializer::from_str(&self.json).deserialize_tuple_struct(name, len, visitor)
781 }
782
783 fn deserialize_map<V>(self, visitor: V) -> Result<V::Value, Error>
784 where
785 V: Visitor<'de>,
786 {
787 crate::Deserializer::from_str(&self.json).deserialize_map(visitor)
788 }
789
790 fn deserialize_struct<V>(
791 self,
792 name: &'static str,
793 fields: &'static [&'static str],
794 visitor: V,
795 ) -> Result<V::Value, Error>
796 where
797 V: Visitor<'de>,
798 {
799 crate::Deserializer::from_str(&self.json).deserialize_struct(name, fields, visitor)
800 }
801
802 fn deserialize_enum<V>(
803 self,
804 name: &'static str,
805 variants: &'static [&'static str],
806 visitor: V,
807 ) -> Result<V::Value, Error>
808 where
809 V: Visitor<'de>,
810 {
811 crate::Deserializer::from_str(&self.json).deserialize_enum(name, variants, visitor)
812 }
813
814 fn deserialize_identifier<V>(self, visitor: V) -> Result<V::Value, Error>
815 where
816 V: Visitor<'de>,
817 {
818 crate::Deserializer::from_str(&self.json).deserialize_identifier(visitor)
819 }
820
821 fn deserialize_ignored_any<V>(self, visitor: V) -> Result<V::Value, Error>
822 where
823 V: Visitor<'de>,
824 {
825 crate::Deserializer::from_str(&self.json).deserialize_ignored_any(visitor)
826 }
827}