Skip to content

Commit 66ae3b6

Browse files
authored
Pass state to container advance methods (#18)
The serializer state and deserializer state is now passed to `next_key`, `next_value` and `next` on the sinks and emitters.
1 parent 14e7394 commit 66ae3b6

File tree

12 files changed

+135
-109
lines changed

12 files changed

+135
-109
lines changed

CHANGELOG.md

+2
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ All notable changes to deser are documented here.
77
- Made `Atom` non exhaustive and added `unexpected_atom` to `Deserialize`.
88
- Removed `MapSink` and `SeqSink`. The functionality of these is now
99
directly on the `Sink`.
10+
- The serializer state and deserializer state is now passed to `next_key`/
11+
`next_value` and `next` on the sinks and emitters.
1012

1113
## 0.5.0
1214

deser-derive/src/de.rs

+6-2
Original file line numberDiff line numberDiff line change
@@ -193,11 +193,15 @@ fn derive_struct(input: &syn::DeriveInput, fields: &syn::FieldsNamed) -> syn::Re
193193
::deser::__derive::Ok(())
194194
}
195195

196-
fn next_key(&mut self) -> ::deser::__derive::Result<::deser::de::SinkHandle> {
196+
fn next_key(&mut self, __state: &::deser::de::DeserializerState)
197+
-> ::deser::__derive::Result<::deser::de::SinkHandle>
198+
{
197199
::deser::__derive::Ok(::deser::de::Deserialize::deserialize_into(&mut self.key))
198200
}
199201

200-
fn next_value(&mut self) -> ::deser::__derive::Result<::deser::de::SinkHandle> {
202+
fn next_value(&mut self, __state: &::deser::de::DeserializerState)
203+
-> ::deser::__derive::Result<::deser::de::SinkHandle>
204+
{
201205
match self.key.take().as_deref() {
202206
#(
203207
#matcher => ::deser::__derive::Ok(::deser::Deserialize::deserialize_into(&mut self.#sink_fieldname)),

deser-derive/src/ser.rs

+3-1
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,9 @@ fn derive_struct(input: &syn::DeriveInput, fields: &syn::FieldsNamed) -> syn::Re
100100
}
101101

102102
impl #wrapper_impl_generics ::deser::ser::StructEmitter for __StructEmitter #wrapper_ty_generics #bounded_where_clause {
103-
fn next(&mut self) -> ::deser::__derive::Option<(deser::__derive::StrCow, ::deser::ser::SerializeHandle)> {
103+
fn next(&mut self, __state: &::deser::ser::SerializerState)
104+
-> ::deser::__derive::Option<(deser::__derive::StrCow, ::deser::ser::SerializeHandle)>
105+
{
104106
loop {
105107
let __index = self.index;
106108
self.index = __index + 1;

deser-path/src/de.rs

+4-4
Original file line numberDiff line numberDiff line change
@@ -70,8 +70,8 @@ impl<'a> Sink for PathSink<'a> {
7070
self.sink.seq(state)
7171
}
7272

73-
fn next_key(&mut self) -> Result<SinkHandle, Error> {
74-
self.sink.next_key().map(|sink| {
73+
fn next_key(&mut self, state: &DeserializerState) -> Result<SinkHandle, Error> {
74+
self.sink.next_key(state).map(|sink| {
7575
SinkHandle::boxed(PathSink {
7676
sink,
7777
container: match self.container {
@@ -83,7 +83,7 @@ impl<'a> Sink for PathSink<'a> {
8383
})
8484
}
8585

86-
fn next_value(&mut self) -> Result<SinkHandle, Error> {
86+
fn next_value(&mut self, state: &DeserializerState) -> Result<SinkHandle, Error> {
8787
let set_segment = match self.container {
8888
Container::None => None,
8989
Container::Map(ref captured_key) => captured_key.borrow_mut().take(),
@@ -93,7 +93,7 @@ impl<'a> Sink for PathSink<'a> {
9393
Some(PathSegment::Index(old_index))
9494
}
9595
};
96-
self.sink.next_value().map(|sink| {
96+
self.sink.next_value(state).map(|sink| {
9797
SinkHandle::boxed(PathSink {
9898
sink,
9999
container: Container::None,

deser-path/src/ser.rs

+8-8
Original file line numberDiff line numberDiff line change
@@ -49,8 +49,8 @@ struct PathStructEmitter<'a> {
4949
}
5050

5151
impl<'a> StructEmitter for PathStructEmitter<'a> {
52-
fn next(&mut self) -> Option<(Cow<'_, str>, SerializeHandle)> {
53-
let (key, value) = self.emitter.next()?;
52+
fn next(&mut self, state: &SerializerState) -> Option<(Cow<'_, str>, SerializeHandle)> {
53+
let (key, value) = self.emitter.next(state)?;
5454
let new_segment = PathSegment::Key(key.to_string());
5555
let value_serializable = SegmentPushingSerializable {
5656
serializable: value,
@@ -66,22 +66,22 @@ struct PathMapEmitter<'a> {
6666
}
6767

6868
impl<'a> MapEmitter for PathMapEmitter<'a> {
69-
fn next_key(&mut self) -> Option<SerializeHandle> {
69+
fn next_key(&mut self, state: &SerializerState) -> Option<SerializeHandle> {
7070
let key_serializable = SegmentCollectingSerializable {
71-
serializable: self.emitter.next_key()?,
71+
serializable: self.emitter.next_key(state)?,
7272
segment: self.path_segment.clone(),
7373
};
7474
Some(SerializeHandle::boxed(key_serializable))
7575
}
7676

77-
fn next_value(&mut self) -> SerializeHandle {
77+
fn next_value(&mut self, state: &SerializerState) -> SerializeHandle {
7878
let new_segment = self
7979
.path_segment
8080
.borrow_mut()
8181
.take()
8282
.unwrap_or(PathSegment::Unknown);
8383
let value_serializable = SegmentPushingSerializable {
84-
serializable: self.emitter.next_value(),
84+
serializable: self.emitter.next_value(state),
8585
segment: RefCell::new(Some(new_segment)),
8686
};
8787
SerializeHandle::boxed(value_serializable)
@@ -94,10 +94,10 @@ struct PathSeqEmitter<'a> {
9494
}
9595

9696
impl<'a> SeqEmitter for PathSeqEmitter<'a> {
97-
fn next(&mut self) -> Option<SerializeHandle> {
97+
fn next(&mut self, state: &SerializerState) -> Option<SerializeHandle> {
9898
let index = self.index;
9999
self.index += 1;
100-
let value = self.emitter.next()?;
100+
let value = self.emitter.next(state)?;
101101
let new_segment = PathSegment::Index(index);
102102
let item_serializable = SegmentPushingSerializable {
103103
serializable: value,

deser/src/de/ignore.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,11 @@ impl Sink for Ignore {
1717
Ok(())
1818
}
1919

20-
fn next_key(&mut self) -> Result<SinkHandle, Error> {
20+
fn next_key(&mut self, _state: &DeserializerState) -> Result<SinkHandle, Error> {
2121
Ok(SinkHandle::null())
2222
}
2323

24-
fn next_value(&mut self) -> Result<SinkHandle, Error> {
24+
fn next_value(&mut self, _state: &DeserializerState) -> Result<SinkHandle, Error> {
2525
Ok(SinkHandle::null())
2626
}
2727
}

deser/src/de/impls.rs

+11-11
Original file line numberDiff line numberDiff line change
@@ -263,7 +263,7 @@ impl<T: Deserialize> Deserialize for Vec<T> {
263263
Ok(())
264264
}
265265

266-
fn next_value(&mut self) -> Result<SinkHandle, Error> {
266+
fn next_value(&mut self, _state: &DeserializerState) -> Result<SinkHandle, Error> {
267267
self.flush();
268268
Ok(Deserialize::deserialize_into(&mut self.element))
269269
}
@@ -325,12 +325,12 @@ where
325325
Ok(())
326326
}
327327

328-
fn next_key(&mut self) -> Result<SinkHandle, Error> {
328+
fn next_key(&mut self, _state: &DeserializerState) -> Result<SinkHandle, Error> {
329329
self.flush();
330330
Ok(Deserialize::deserialize_into(&mut self.key))
331331
}
332332

333-
fn next_value(&mut self) -> Result<SinkHandle, Error> {
333+
fn next_value(&mut self, _state: &DeserializerState) -> Result<SinkHandle, Error> {
334334
Ok(Deserialize::deserialize_into(&mut self.value))
335335
}
336336

@@ -388,12 +388,12 @@ where
388388
&DESCRIPTOR
389389
}
390390

391-
fn next_key(&mut self) -> Result<SinkHandle, Error> {
391+
fn next_key(&mut self, _state: &DeserializerState) -> Result<SinkHandle, Error> {
392392
self.flush();
393393
Ok(Deserialize::deserialize_into(&mut self.key))
394394
}
395395

396-
fn next_value(&mut self) -> Result<SinkHandle, Error> {
396+
fn next_value(&mut self, _state: &DeserializerState) -> Result<SinkHandle, Error> {
397397
Ok(Deserialize::deserialize_into(&mut self.value))
398398
}
399399

@@ -445,12 +445,12 @@ impl<'a> Sink for NullIgnoringSink<'a> {
445445
self.sink.seq(state)
446446
}
447447

448-
fn next_key(&mut self) -> Result<SinkHandle, Error> {
449-
self.sink.next_key()
448+
fn next_key(&mut self, state: &DeserializerState) -> Result<SinkHandle, Error> {
449+
self.sink.next_key(state)
450450
}
451451

452-
fn next_value(&mut self) -> Result<SinkHandle, Error> {
453-
self.sink.next_value()
452+
fn next_value(&mut self, state: &DeserializerState) -> Result<SinkHandle, Error> {
453+
self.sink.next_value(state)
454454
}
455455

456456
fn descriptor(&self) -> &dyn Descriptor {
@@ -483,7 +483,7 @@ macro_rules! deserialize_for_tuple {
483483
Ok(())
484484
}
485485

486-
fn next_value(&mut self) -> Result<SinkHandle, Error> {
486+
fn next_value(&mut self, _state: &DeserializerState) -> Result<SinkHandle, Error> {
487487
let __index = self.index;
488488
self.index += 1;
489489
let mut __counter = 0;
@@ -603,7 +603,7 @@ impl<T: Deserialize, const N: usize> Deserialize for [T; N] {
603603
Ok(())
604604
}
605605

606-
fn next_value(&mut self) -> Result<SinkHandle, Error> {
606+
fn next_value(&mut self, _state: &DeserializerState) -> Result<SinkHandle, Error> {
607607
unsafe {
608608
self.flush();
609609
}

deser/src/de/mod.rs

+37-26
Original file line numberDiff line numberDiff line change
@@ -114,14 +114,14 @@
114114
//! Ok(())
115115
//! }
116116
//!
117-
//! fn next_key(&mut self) -> Result<SinkHandle, Error> {
117+
//! fn next_key(&mut self, _state: &DeserializerState) -> Result<SinkHandle, Error> {
118118
//! // directly attach to the key field which can hold any
119119
//! // string value. This means that any string is accepted
120120
//! // as key.
121121
//! Ok(Deserialize::deserialize_into(&mut self.key))
122122
//! }
123123
//!
124-
//! fn next_value(&mut self) -> Result<SinkHandle, Error> {
124+
//! fn next_value(&mut self, _state: &DeserializerState) -> Result<SinkHandle, Error> {
125125
//! // whenever we are looking for a value slot, look at the last key
126126
//! // to decide which value slot to connect.
127127
//! match self.key.take().as_deref() {
@@ -337,12 +337,14 @@ pub trait Sink {
337337
}
338338

339339
/// Returns a sink for the next key in a map.
340-
fn next_key(&mut self) -> Result<SinkHandle, Error> {
340+
fn next_key(&mut self, state: &DeserializerState) -> Result<SinkHandle, Error> {
341+
let _ = state;
341342
Ok(SinkHandle::null())
342343
}
343344

344345
/// Returns a sink for the next value in a map or sequence.
345-
fn next_value(&mut self) -> Result<SinkHandle, Error> {
346+
fn next_value(&mut self, state: &DeserializerState) -> Result<SinkHandle, Error> {
347+
let _ = state;
346348
Ok(SinkHandle::null())
347349
}
348350

@@ -370,7 +372,7 @@ pub trait Sink {
370372
/// Gives access to the deserializer state.
371373
pub struct DeserializerState<'a> {
372374
extensions: Extensions,
373-
stack: ManuallyDrop<Vec<(SinkHandleWrapper, Layer)>>,
375+
descriptor_stack: Vec<&'a dyn Descriptor>,
374376
_marker: PhantomData<&'a Driver<'a>>,
375377
}
376378

@@ -387,14 +389,14 @@ impl<'a> DeserializerState<'a> {
387389

388390
/// Returns the current recursion depth.
389391
pub fn depth(&self) -> usize {
390-
self.stack.len()
392+
self.descriptor_stack.len()
391393
}
392394

393395
/// Returns the topmost descriptor.
394396
///
395397
/// This descriptor always points to a container as the descriptor.
396398
pub fn top_descriptor(&self) -> Option<&dyn Descriptor> {
397-
self.stack.last().map(|x| x.0.sink.descriptor())
399+
self.descriptor_stack.last().copied()
398400
}
399401
}
400402

@@ -405,8 +407,9 @@ impl<'a> DeserializerState<'a> {
405407
/// internally impossible with safe code, this is a safe abstractiont that
406408
/// hides the unsafety internally.
407409
pub struct Driver<'a> {
408-
state: ManuallyDrop<DeserializerState<'a>>,
410+
state: DeserializerState<'a>,
409411
current_sink: Option<SinkHandleWrapper>,
412+
sink_stack: ManuallyDrop<Vec<(SinkHandleWrapper, Layer)>>,
410413
}
411414

412415
struct SinkHandleWrapper {
@@ -437,11 +440,12 @@ impl<'a> Driver<'a> {
437440
/// Creates a new deserializer driver from a sink.
438441
pub fn from_sink(sink: SinkHandle) -> Driver<'a> {
439442
Driver {
440-
state: ManuallyDrop::new(DeserializerState {
443+
state: DeserializerState {
441444
extensions: Extensions::default(),
442-
stack: ManuallyDrop::new(Vec::new()),
445+
descriptor_stack: Vec::new(),
443446
_marker: PhantomData,
444-
}),
447+
},
448+
sink_stack: ManuallyDrop::new(Default::default()),
445449
current_sink: Some(unsafe { SinkHandleWrapper::from(sink) }),
446450
}
447451
}
@@ -467,19 +471,20 @@ impl<'a> Driver<'a> {
467471
fn _emit(&mut self, event: Event) -> Result<(), Error> {
468472
macro_rules! target_sink {
469473
() => {{
470-
match self.state.stack.last_mut() {
474+
match self.sink_stack.last_mut() {
471475
Some((map_sink, Layer::Map(ref mut is_key))) => {
472476
let next_sink = if *is_key {
473-
map_sink.sink.next_key()?
477+
map_sink.sink.next_key(&self.state)?
474478
} else {
475-
map_sink.sink.next_value()?
479+
map_sink.sink.next_value(&self.state)?
476480
};
477481
*is_key = !*is_key;
478482
self.current_sink = Some(unsafe { SinkHandleWrapper::from(next_sink) });
479483
}
480484
Some((seq_sink, Layer::Seq)) => {
481-
self.current_sink =
482-
Some(unsafe { SinkHandleWrapper::from(seq_sink.sink.next_value()?) });
485+
self.current_sink = Some(unsafe {
486+
SinkHandleWrapper::from(seq_sink.sink.next_value(&self.state)?)
487+
});
483488
}
484489
_ => {}
485490
}
@@ -501,29 +506,37 @@ impl<'a> Driver<'a> {
501506
Event::MapStart => {
502507
let current_sink = target_sink!();
503508
current_sink.map(&self.state)?;
509+
let descriptor = current_sink.descriptor();
504510
self.state
505-
.stack
511+
.descriptor_stack
512+
.push(unsafe { extend_lifetime!(descriptor, &dyn Descriptor) });
513+
self.sink_stack
506514
.push((self.current_sink.take().unwrap(), Layer::Map(true)));
507515
return Ok(());
508516
}
509-
Event::MapEnd => match self.state.stack.pop() {
517+
Event::MapEnd => match self.sink_stack.pop() {
510518
Some((mut map_sink, Layer::Map(_))) => {
511519
map_sink.sink.finish(&self.state)?;
520+
self.state.descriptor_stack.pop();
512521
self.current_sink = Some(map_sink);
513522
}
514523
_ => panic!("not inside a MapSink"),
515524
},
516525
Event::SeqStart => {
517526
let current_sink = target_sink!();
518527
current_sink.seq(&self.state)?;
528+
let descriptor = current_sink.descriptor();
519529
self.state
520-
.stack
530+
.descriptor_stack
531+
.push(unsafe { extend_lifetime!(descriptor, &dyn Descriptor) });
532+
self.sink_stack
521533
.push((self.current_sink.take().unwrap(), Layer::Seq));
522534
return Ok(());
523535
}
524-
Event::SeqEnd => match self.state.stack.pop() {
536+
Event::SeqEnd => match self.sink_stack.pop() {
525537
Some((mut seq_sink, Layer::Seq)) => {
526538
seq_sink.sink.finish(&self.state)?;
539+
self.state.descriptor_stack.pop();
527540
self.current_sink = Some(seq_sink);
528541
}
529542
_ => panic!("not inside a SeqSink"),
@@ -538,13 +551,11 @@ impl<'a> Driver<'a> {
538551

539552
impl<'a> Drop for Driver<'a> {
540553
fn drop(&mut self) {
541-
// it's important that we drop the values in inverse order.
542-
while let Some(_last) = self.state.stack.pop() {
543-
// drop in inverse order
544-
}
545554
unsafe {
546-
ManuallyDrop::drop(&mut self.state.stack);
547-
ManuallyDrop::drop(&mut self.state);
555+
while let Some(_item) = self.sink_stack.pop() {
556+
// drop in inverse order
557+
}
558+
ManuallyDrop::drop(&mut self.sink_stack);
548559
}
549560
}
550561
}

0 commit comments

Comments
 (0)