Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 10 additions & 18 deletions deser-debug/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ use deser::{Atom, Event};

/// Serializes a serializable value to `Debug` format.
pub struct ToDebug {
events: Vec<(Event<'static>, Option<String>)>,
events: Vec<Event<'static>>,
}

impl fmt::Display for ToDebug {
Expand All @@ -28,19 +28,19 @@ impl ToDebug {
pub fn new(value: &dyn Serialize) -> ToDebug {
let mut events = Vec::new();
let mut driver = SerializeDriver::new(value);
while let Some((event, descriptor, _)) = driver.next().unwrap() {
events.push((event.to_static(), descriptor.name().map(|x| x.to_string())));
while let Some((event, _)) = driver.next().unwrap() {
events.push(event.to_static());
}
ToDebug { events }
}
}

fn dump<'a, 'f>(
tokens: &'a [(Event<'a>, Option<String>)],
tokens: &'a [Event<'a>],
f: &'f mut fmt::Formatter<'_>,
) -> Result<&'a [(Event<'a>, Option<String>)], fmt::Error> {
) -> Result<&'a [Event<'a>], fmt::Error> {
if let Some((first, mut rest)) = tokens.split_first() {
match first.0 {
match first {
Event::Atom(Atom::Null) => fmt::Debug::fmt(&(), f)?,
Event::Atom(Atom::Bool(v)) => fmt::Debug::fmt(&v, f)?,
Event::Atom(Atom::Str(ref v)) => fmt::Debug::fmt(v, f)?,
Expand Down Expand Up @@ -71,13 +71,10 @@ fn dump<'a, 'f>(
Event::Atom(Atom::F64(v)) => fmt::Debug::fmt(&v, f)?,
Event::Atom(..) => f.debug_struct("?").finish()?,
Event::MapStart => {
if let Some(ref name) = first.1 {
write!(f, "{} ", name)?;
}
let mut map = f.debug_map();
let mut is_key = true;
loop {
if rest.get(0).map_or(false, |x| matches!(x.0, Event::MapEnd)) {
if rest.get(0).map_or(false, |x| matches!(x, Event::MapEnd)) {
rest = &rest[1..];
break;
}
Expand All @@ -94,14 +91,9 @@ fn dump<'a, 'f>(
}
Event::MapEnd => unreachable!(),
Event::SeqStart => {
if let Some(ref name) = first.1 {
if name != "Vec" && name != "slice" {
write!(f, "{} ", name)?;
}
}
let mut list = f.debug_list();
loop {
if rest.get(0).map_or(false, |x| matches!(x.0, Event::SeqEnd)) {
if rest.get(0).map_or(false, |x| matches!(x, Event::SeqEnd)) {
rest = &rest[1..];
break;
}
Expand All @@ -119,7 +111,7 @@ fn dump<'a, 'f>(
}
}

struct Helper<'a>(&'a [(Event<'a>, Option<String>)], AtomicUsize);
struct Helper<'a>(&'a [Event<'a>], AtomicUsize);

impl<'a> fmt::Debug for Helper<'a> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
Expand All @@ -138,6 +130,6 @@ fn test_debug_format() {

assert_eq!(
ToDebug::new(&m).to_string(),
"BTreeMap {false: [], true: [[b\"x\", b\"yyy\"], [b\"zzzz\\0\\x01\"]]}"
"{false: [], true: [[b\"x\", b\"yyy\"], [b\"zzzz\\0\\x01\"]]}"
);
}
19 changes: 0 additions & 19 deletions deser-derive/src/de.rs
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,6 @@ fn derive_struct(input: &syn::DeriveInput, fields: &syn::FieldsNamed) -> syn::Re
);

let container_attrs = ContainerAttrs::of(input)?;
let type_name = container_attrs.container_name();
let attrs = fields
.named
.iter()
Expand Down Expand Up @@ -251,10 +250,6 @@ fn derive_struct(input: &syn::DeriveInput, fields: &syn::FieldsNamed) -> syn::Re

#[automatically_derived]
impl #wrapper_impl_generics ::deser::de::Sink for __Sink #wrapper_ty_generics #bounded_where_clause {
fn descriptor(&self) -> &dyn ::deser::Descriptor {
&__Descriptor
}

fn map(&mut self, __state: &::deser::de::DeserializerState)
-> ::deser::__derive::Result<()>
{
Expand Down Expand Up @@ -312,14 +307,6 @@ fn derive_struct(input: &syn::DeriveInput, fields: &syn::FieldsNamed) -> syn::Re
::deser::__derive::Ok(())
}
}

struct __Descriptor;

impl ::deser::Descriptor for __Descriptor {
fn name(&self) -> ::deser::__derive::Option<&::deser::__derive::str> {
::deser::__derive::Some(#type_name)
}
}
};
})
}
Expand Down Expand Up @@ -451,8 +438,6 @@ fn derive_newtype_struct(input: &syn::DeriveInput, field: &syn::Field) -> syn::R
Span::call_site(),
);

// TODO: we want to report the type name here but the current descriptor
// interface does not let us. https://github.com/mitsuhiko/deser/issues/8
let container_attrs = ContainerAttrs::of(input)?;
let _type_name = container_attrs.container_name();

Expand Down Expand Up @@ -526,10 +511,6 @@ fn derive_newtype_struct(input: &syn::DeriveInput, field: &syn::Field) -> syn::R
Ok(())
}

fn descriptor(&self) -> &dyn ::deser::Descriptor {
self.sink.borrow().descriptor()
}

fn expecting(&self) -> ::deser::__derive::StrCow<'_> {
self.sink.borrow().expecting()
}
Expand Down
17 changes: 0 additions & 17 deletions deser-derive/src/ser.rs
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,6 @@ fn derive_struct(input: &syn::DeriveInput, fields: &syn::FieldsNamed) -> syn::Re
);

let container_attrs = ContainerAttrs::of(input)?;
let type_name = container_attrs.container_name();
let attrs = fields
.named
.iter()
Expand Down Expand Up @@ -153,9 +152,6 @@ fn derive_struct(input: &syn::DeriveInput, fields: &syn::FieldsNamed) -> syn::Re
const #dummy: () = {
#[automatically_derived]
impl #impl_generics ::deser::Serialize for #ident #ty_generics #bounded_where_clause {
fn descriptor(&self) -> &dyn ::deser::Descriptor {
&__Descriptor
}
fn serialize(&self, __state: &::deser::ser::SerializerState) -> ::deser::__derive::Result<::deser::ser::Chunk> {
::deser::__derive::Ok(::deser::ser::Chunk::Struct(Box::new(__StructEmitter {
data: self,
Expand All @@ -171,14 +167,6 @@ fn derive_struct(input: &syn::DeriveInput, fields: &syn::FieldsNamed) -> syn::Re
#temp_emitter
}

struct __Descriptor;

impl ::deser::Descriptor for __Descriptor {
fn name(&self) -> ::deser::__derive::Option<&::deser::__derive::str> {
::deser::__derive::Some(#type_name)
}
}

#[automatically_derived]
impl #wrapper_impl_generics ::deser::ser::StructEmitter for __StructEmitter #wrapper_ty_generics #bounded_where_clause {
fn next(&mut self, __state: &::deser::ser::SerializerState)
Expand Down Expand Up @@ -265,8 +253,6 @@ fn derive_newtype_struct(input: &syn::DeriveInput, field: &syn::Field) -> syn::R
Span::call_site(),
);

// TODO: we want to report the type name here but the current descriptor
// interface does not let us. https://github.com/mitsuhiko/deser/issues/8
let container_attrs = ContainerAttrs::of(input)?;
let _type_name = container_attrs.container_name();

Expand All @@ -280,9 +266,6 @@ fn derive_newtype_struct(input: &syn::DeriveInput, field: &syn::Field) -> syn::R
const #dummy: () = {
#[automatically_derived]
impl #impl_generics ::deser::Serialize for #ident #ty_generics #bounded_where_clause {
fn descriptor(&self) -> &dyn ::deser::Descriptor {
self.0.descriptor()
}
fn serialize(&self, __state: &::deser::ser::SerializerState) -> ::deser::__derive::Result<::deser::ser::Chunk> {
::deser::ser::Serialize::serialize(&self.0, __state)
}
Expand Down
2 changes: 1 addition & 1 deletion deser-json/src/ser.rs
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ impl Serializer {
}};
}

while let Some((event, _, _)) = driver.next()? {
while let Some((event, _)) = driver.next()? {
// try to exit containers first
match event {
Event::MapEnd => {
Expand Down
6 changes: 1 addition & 5 deletions deser-path/src/de.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ use std::cell::RefCell;
use std::rc::Rc;

use deser::de::{DeserializerState, Sink, SinkHandle};
use deser::{Atom, Descriptor, Error};
use deser::{Atom, Error};

use crate::{Path, PathSegment};

Expand Down Expand Up @@ -106,10 +106,6 @@ impl<'a> Sink for PathSink<'a> {
self.sink.finish(state)
}

fn descriptor(&self) -> &dyn Descriptor {
self.sink.descriptor()
}

fn expecting(&self) -> Cow<'_, str> {
self.sink.expecting()
}
Expand Down
2 changes: 1 addition & 1 deletion deser-path/tests/ser.rs
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ fn test_path() {

let serializable = PathSerializable::wrap(&map);
let mut driver = SerializeDriver::new(&serializable);
while let Some((event, _, state)) = driver.next().unwrap() {
while let Some((event, state)) = driver.next().unwrap() {
events.push(format!("{:?}|{:?}", event, state.get::<Path>().segments()));
}

Expand Down
19 changes: 7 additions & 12 deletions deser/src/de/driver.rs
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
use std::marker::PhantomData;
use std::mem::ManuallyDrop;

use crate::de::{Deserialize, DeserializerState, SinkHandle};
use crate::descriptors::Descriptor;
use crate::error::Error;
use crate::event::Event;
use crate::extensions::Extensions;
Expand Down Expand Up @@ -36,7 +36,8 @@ impl<'a> DeserializeDriver<'a> {
DeserializeDriver {
state: DeserializerState {
extensions: Extensions::default(),
descriptor_stack: Vec::with_capacity(STACK_CAPACITY),
depth: 0,
_marker: PhantomData,
},
sink_stack: ManuallyDrop::new(Vec::with_capacity(STACK_CAPACITY)),
current_sink: Some(unsafe { extend_lifetime!(sink, SinkHandle<'_>) }),
Expand Down Expand Up @@ -96,37 +97,31 @@ impl<'a> DeserializeDriver<'a> {
Event::MapStart => {
let current_sink = current_sink!();
current_sink.map(&self.state)?;
let descriptor = current_sink.descriptor();
self.state
.descriptor_stack
.push(unsafe { extend_lifetime!(descriptor, &dyn Descriptor) });
self.state.depth += 1;
self.sink_stack
.push((self.current_sink.take().unwrap(), Layer::Map(true)));
return Ok(());
}
Event::MapEnd => match self.sink_stack.pop() {
Some((mut map_sink, Layer::Map(_))) => {
map_sink.finish(&self.state)?;
self.state.descriptor_stack.pop();
self.state.depth -= 1;
self.current_sink = Some(map_sink);
}
_ => panic!("not inside a MapSink"),
},
Event::SeqStart => {
let current_sink = current_sink!();
current_sink.seq(&self.state)?;
let descriptor = current_sink.descriptor();
self.state
.descriptor_stack
.push(unsafe { extend_lifetime!(descriptor, &dyn Descriptor) });
self.state.depth += 1;
self.sink_stack
.push((self.current_sink.take().unwrap(), Layer::Seq));
return Ok(());
}
Event::SeqEnd => match self.sink_stack.pop() {
Some((mut seq_sink, Layer::Seq)) => {
seq_sink.finish(&self.state)?;
self.state.descriptor_stack.pop();
self.state.depth -= 1;
self.current_sink = Some(seq_sink);
}
_ => panic!("not inside a SeqSink"),
Expand Down
Loading