Skip to content

Commit ef8dcae

Browse files
committed
Experiment with serde-rs/serde#2912
1 parent 677cf17 commit ef8dcae

File tree

4 files changed

+279
-0
lines changed

4 files changed

+279
-0
lines changed

Cargo.toml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,3 +47,7 @@ bytes = { version = "1.3", default-features = false, features = ["serde"] }
4747
[package.metadata.docs.rs]
4848
features = ["integer128", "indexmap"]
4949
rustdoc-args = ["--generate-link-to-definition"]
50+
51+
[patch.crates-io]
52+
serde = { git = "https://github.com/dtolnay/serde.git", branch = "buffer" }
53+
serde_derive = { git = "https://github.com/dtolnay/serde.git", branch = "buffer" }

src/de/mod.rs

Lines changed: 272 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ const SERDE_TAG_KEY_CANARY: &str = "serde::__private::de::content::TagOrContent"
3030
///
3131
/// If you just want to simply deserialize a value,
3232
/// you can use the [`from_str`] convenience function.
33+
#[derive(Copy, Clone)]
3334
pub struct Deserializer<'de> {
3435
pub(crate) parser: Parser<'de>,
3536
newtype_variant: bool,
@@ -773,6 +774,269 @@ impl<'de, 'a> de::Deserializer<'de> for &'a mut Deserializer<'de> {
773774
}
774775
}
775776

777+
impl<'de> serde::de::Buffer<'de> for OwnedDeserializer<'de> {
778+
type Error = Error;
779+
780+
type OwnedDeserializer = Self;
781+
782+
type RefDeserializer<'b> = Self where 'de: 'b;
783+
784+
fn owned_deserializer(self) -> Self::OwnedDeserializer {
785+
self
786+
}
787+
788+
fn ref_deserializer<'b>(&'b self) -> Self::RefDeserializer<'b>
789+
where
790+
'de: 'b,
791+
{
792+
*self
793+
}
794+
}
795+
796+
#[derive(Copy, Clone)]
797+
struct OwnedDeserializer<'de> {
798+
de: Deserializer<'de>
799+
}
800+
801+
impl<'de> serde::de::Deserializer<'de> for OwnedDeserializer<'de> {
802+
type Error = Error;
803+
804+
fn deserialize_any<V>(mut self, visitor: V) -> Result<V::Value>
805+
where
806+
V: Visitor<'de>,
807+
{
808+
self.de.deserialize_any(visitor)
809+
}
810+
811+
fn deserialize_bool<V>(mut self, visitor: V) -> Result<V::Value>
812+
where
813+
V: Visitor<'de>,
814+
{
815+
self.de.deserialize_bool(visitor)
816+
}
817+
818+
fn deserialize_i8<V>(mut self, visitor: V) -> Result<V::Value>
819+
where
820+
V: Visitor<'de>,
821+
{
822+
self.de.deserialize_i8(visitor)
823+
}
824+
825+
fn deserialize_i16<V>(mut self, visitor: V) -> Result<V::Value>
826+
where
827+
V: Visitor<'de>,
828+
{
829+
self.de.deserialize_i16(visitor)
830+
}
831+
832+
fn deserialize_i32<V>(mut self, visitor: V) -> Result<V::Value>
833+
where
834+
V: Visitor<'de>,
835+
{
836+
self.de.deserialize_i32(visitor)
837+
}
838+
839+
fn deserialize_i64<V>(mut self, visitor: V) -> Result<V::Value>
840+
where
841+
V: Visitor<'de>,
842+
{
843+
self.de.deserialize_i64(visitor)
844+
}
845+
846+
#[cfg(feature = "integer128")]
847+
fn deserialize_i128<V>(mut self, visitor: V) -> Result<V::Value>
848+
where
849+
V: Visitor<'de>,
850+
{
851+
self.de.deserialize_i128(Visitor)
852+
}
853+
854+
fn deserialize_u8<V>(mut self, visitor: V) -> Result<V::Value>
855+
where
856+
V: Visitor<'de>,
857+
{
858+
self.de.deserialize_u8(visitor)
859+
}
860+
861+
fn deserialize_u16<V>(mut self, visitor: V) -> Result<V::Value>
862+
where
863+
V: Visitor<'de>,
864+
{
865+
self.de.deserialize_u16(visitor)
866+
}
867+
868+
fn deserialize_u32<V>(mut self, visitor: V) -> Result<V::Value>
869+
where
870+
V: Visitor<'de>,
871+
{
872+
self.de.deserialize_u32(visitor)
873+
}
874+
875+
fn deserialize_u64<V>(mut self, visitor: V) -> Result<V::Value>
876+
where
877+
V: Visitor<'de>,
878+
{
879+
self.de.deserialize_u64(visitor)
880+
}
881+
882+
#[cfg(feature = "integer128")]
883+
fn deserialize_u128<V>(mut self, visitor: V) -> Result<V::Value>
884+
where
885+
V: Visitor<'de>,
886+
{
887+
self.de.deserialize_u128(visitor)
888+
}
889+
890+
fn deserialize_f32<V>(mut self, visitor: V) -> Result<V::Value>
891+
where
892+
V: Visitor<'de>,
893+
{
894+
self.de.deserialize_f32(visitor)
895+
}
896+
897+
fn deserialize_f64<V>(mut self, visitor: V) -> Result<V::Value>
898+
where
899+
V: Visitor<'de>,
900+
{
901+
self.de.deserialize_f64(visitor)
902+
}
903+
904+
fn deserialize_char<V>(mut self, visitor: V) -> Result<V::Value>
905+
where
906+
V: Visitor<'de>,
907+
{
908+
self.de.deserialize_char(visitor)
909+
}
910+
911+
fn deserialize_str<V>(mut self, visitor: V) -> Result<V::Value>
912+
where
913+
V: Visitor<'de>,
914+
{
915+
self.de.deserialize_str(visitor)
916+
}
917+
918+
fn deserialize_string<V>(mut self, visitor: V) -> Result<V::Value>
919+
where
920+
V: Visitor<'de>,
921+
{
922+
self.de.deserialize_string(visitor)
923+
}
924+
925+
fn deserialize_bytes<V>(mut self, visitor: V) -> Result<V::Value>
926+
where
927+
V: Visitor<'de>,
928+
{
929+
self.de.deserialize_bytes(visitor)
930+
}
931+
932+
fn deserialize_byte_buf<V>(mut self, visitor: V) -> Result<V::Value>
933+
where
934+
V: Visitor<'de>,
935+
{
936+
self.de.deserialize_byte_buf(visitor)
937+
}
938+
939+
fn deserialize_option<V>(mut self, visitor: V) -> Result<V::Value>
940+
where
941+
V: Visitor<'de>,
942+
{
943+
self.de.deserialize_option(visitor)
944+
}
945+
946+
// In Serde, unit means an anonymous value containing no data.
947+
fn deserialize_unit<V>(mut self, visitor: V) -> Result<V::Value>
948+
where
949+
V: Visitor<'de>,
950+
{
951+
self.de.deserialize_unit(visitor)
952+
}
953+
954+
fn deserialize_unit_struct<V>(mut self, name: &'static str, visitor: V) -> Result<V::Value>
955+
where
956+
V: Visitor<'de>,
957+
{
958+
self.de.deserialize_unit_struct(name, visitor)
959+
}
960+
961+
fn deserialize_newtype_struct<V>(mut self, name: &'static str, visitor: V) -> Result<V::Value>
962+
where
963+
V: Visitor<'de>,
964+
{
965+
self.de.deserialize_unit_struct(name, visitor)
966+
}
967+
968+
fn deserialize_seq<V>(mut self, visitor: V) -> Result<V::Value>
969+
where
970+
V: Visitor<'de>,
971+
{
972+
self.de.deserialize_seq(visitor)
973+
}
974+
975+
fn deserialize_tuple<V>(mut self, len: usize, visitor: V) -> Result<V::Value>
976+
where
977+
V: Visitor<'de>,
978+
{
979+
self.de.deserialize_tuple(len, visitor)
980+
}
981+
982+
fn deserialize_tuple_struct<V>(
983+
mut self,
984+
name: &'static str,
985+
len: usize,
986+
visitor: V,
987+
) -> Result<V::Value>
988+
where
989+
V: Visitor<'de>,
990+
{
991+
self.de.deserialize_tuple_struct(name, len, visitor)
992+
}
993+
994+
fn deserialize_map<V>(mut self, visitor: V) -> Result<V::Value>
995+
where
996+
V: Visitor<'de>,
997+
{
998+
self.de.deserialize_map(visitor)
999+
}
1000+
1001+
fn deserialize_struct<V>(
1002+
mut self,
1003+
name: &'static str,
1004+
fields: &'static [&'static str],
1005+
visitor: V,
1006+
) -> Result<V::Value>
1007+
where
1008+
V: Visitor<'de>,
1009+
{
1010+
self.de.deserialize_struct(name, fields, visitor)
1011+
}
1012+
1013+
fn deserialize_enum<V>(
1014+
mut self,
1015+
name: &'static str,
1016+
variants: &'static [&'static str],
1017+
visitor: V,
1018+
) -> Result<V::Value>
1019+
where
1020+
V: Visitor<'de>,
1021+
{
1022+
self.de.deserialize_enum(name, variants, visitor)
1023+
}
1024+
1025+
fn deserialize_identifier<V>(mut self, visitor: V) -> Result<V::Value>
1026+
where
1027+
V: Visitor<'de>,
1028+
{
1029+
self.de.deserialize_identifier(visitor)
1030+
}
1031+
1032+
fn deserialize_ignored_any<V>(mut self, visitor: V) -> Result<V::Value>
1033+
where
1034+
V: Visitor<'de>,
1035+
{
1036+
self.de.deserialize_ignored_any(visitor)
1037+
}
1038+
}
1039+
7761040
enum Terminator {
7771041
Map,
7781042
MapAsStruct,
@@ -897,6 +1161,14 @@ impl<'de, 'a> de::MapAccess<'de> for CommaSeparated<'a, 'de> {
8971161
Err(Error::ExpectedMapColon)
8981162
}
8991163
}
1164+
1165+
fn next_value_buffer(
1166+
&mut self,
1167+
) -> Result<impl serde::de::Buffer<'de, Error = Self::Error> + use<'de, 'a>, Self::Error> {
1168+
Ok(OwnedDeserializer {
1169+
de: Deserializer { parser: self.de.parser.clone(), newtype_variant: self.de.newtype_variant, serde_content_newtype: self.de.serde_content_newtype, last_identifier: self.de.last_identifier, recursion_limit: self.de.recursion_limit }
1170+
})
1171+
}
9001172
}
9011173

9021174
struct Enum<'a, 'de: 'a> {

src/lib.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@
1515
#![doc = include_str!("../README.md")]
1616
#![doc(html_root_url = "https://docs.rs/ron/0.9.0")]
1717

18+
#![feature(precise_capturing_in_traits)]
19+
1820
pub mod de;
1921
pub mod ser;
2022

src/parse.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ pub(crate) type LargeSInt = i128;
5454
#[cfg(not(feature = "integer128"))]
5555
pub(crate) type LargeSInt = i64;
5656

57+
#[derive(Copy, Clone)]
5758
pub struct Parser<'a> {
5859
/// Bits set according to the [`Extensions`] enum.
5960
pub exts: Extensions,

0 commit comments

Comments
 (0)