1 //! Serde deserializer for perl values.
3 use std
::marker
::PhantomData
;
5 use serde
::de
::{self, Deserialize, DeserializeSeed, MapAccess, SeqAccess, Visitor}
;
7 use crate::error
::Error
;
8 use crate::scalar
::Type
;
10 use crate::{array, ffi, hash}
;
12 /// Perl [`Value`](crate::Value) deserializer.
13 struct Deserializer
<'de
> {
16 _lifetime
: PhantomData
<&'de Value
>,
19 /// Deserialize a perl [`Value`](crate::Value).
21 /// Note that this causes all the underlying data to be copied recursively.
22 pub fn from_value
<T
>(input
: Value
) -> Result
<T
, Error
>
24 T
: serde
::de
::DeserializeOwned
,
26 let mut deserializer
= Deserializer
::<'
static>::from_value(input
);
27 let out
= T
::deserialize(&mut deserializer
)?
;
31 /// Deserialize a reference to a perl [`Value`](crate::Value).
33 /// Note that this causes all the underlying data to be copied recursively, except for data
34 /// deserialized to `&[u8]` or `&str`, which will reference the "original" value (whatever that
36 pub fn from_ref_value
<'de
, T
>(input
: &'de Value
) -> Result
<T
, Error
>
40 let mut deserializer
= Deserializer
::<'de
>::from_value(input
.clone_ref());
41 let out
= T
::deserialize(&mut deserializer
)?
;
45 impl<'deserializer
> Deserializer
<'deserializer
> {
46 pub fn from_value(input
: Value
) -> Self {
50 _lifetime
: PhantomData
,
54 fn deref_current(&mut self) -> Result
<(), Error
> {
55 while let Value
::Reference(_
) = &self.input
{
56 self.input
= self.input
.dereference().ok_or_else(|| {
57 Error
::new("failed to dereference a reference while deserializing")
63 fn sanity_check(&mut self) -> Result
<(), Error
> {
64 if let Value
::Scalar(value
) = &self.input
{
66 Type
::Scalar(_
) => Ok(()),
67 Type
::Other(other
) => Err(Error(format
!(
68 "cannot deserialize weird magic perl values ({})",
71 // These are impossible as they are all handled by different Value enum types:
72 Type
::Reference
=> Error
::fail("Value::Scalar: containing a reference"),
73 Type
::Array
=> Error
::fail("Value::Scalar: containing an array"),
74 Type
::Hash
=> Error
::fail("Value::Scalar: containing a hash"),
81 fn get(&mut self) -> Result
<&Value
, Error
> {
82 self.deref_current()?
;
87 /// deserialize_any, preferring a string value
88 fn deserialize_any_string
<'de
, V
>(&mut self, visitor
: V
) -> Result
<V
::Value
, Error
>
93 Value
::Scalar(value
) => match value
.ty() {
94 Type
::Scalar(flags
) => {
95 use crate::scalar
::Flags
;
97 if flags
.contains(Flags
::STRING
) {
98 let s
= unsafe { str_set_wrong_lifetime(value.pv_string_utf8()) }
;
99 visitor
.visit_borrowed_str(s
)
100 } else if flags
.contains(Flags
::DOUBLE
) {
101 visitor
.visit_f64(value
.nv())
102 } else if flags
.contains(Flags
::INTEGER
) {
103 visitor
.visit_i64(value
.iv() as i64)
104 } else if flags
.is_empty() {
112 Value
::Hash(value
) => visitor
.visit_map(HashAccess
::new(value
)),
113 Value
::Array(value
) => visitor
.visit_seq(ArrayAccess
::new(value
)),
114 Value
::Reference(_
) => unreachable
!(),
118 /// deserialize_any, preferring an integer value
119 fn deserialize_any_iv
<'de
, V
>(&mut self, visitor
: V
) -> Result
<V
::Value
, Error
>
124 Value
::Scalar(value
) => match value
.ty() {
125 Type
::Scalar(flags
) => {
126 use crate::scalar
::Flags
;
128 if flags
.contains(Flags
::INTEGER
) {
129 visitor
.visit_i64(value
.iv() as i64)
130 } else if flags
.contains(Flags
::DOUBLE
) {
131 visitor
.visit_f64(value
.nv())
132 } else if flags
.contains(Flags
::STRING
) {
133 let s
= unsafe { str_set_wrong_lifetime(value.pv_string_utf8()) }
;
134 visitor
.visit_borrowed_str(s
)
141 Value
::Hash(value
) => visitor
.visit_map(HashAccess
::new(value
)),
142 Value
::Array(value
) => visitor
.visit_seq(ArrayAccess
::new(value
)),
143 Value
::Reference(_
) => unreachable
!(),
147 /// deserialize_any, preferring a float value
148 fn deserialize_any_nv
<'de
, V
>(&mut self, visitor
: V
) -> Result
<V
::Value
, Error
>
153 Value
::Scalar(value
) => match value
.ty() {
154 Type
::Scalar(flags
) => {
155 use crate::scalar
::Flags
;
157 if flags
.contains(Flags
::DOUBLE
) {
158 visitor
.visit_f64(value
.nv())
159 } else if flags
.contains(Flags
::INTEGER
) {
160 visitor
.visit_i64(value
.iv() as i64)
161 } else if flags
.contains(Flags
::STRING
) {
162 let s
= unsafe { str_set_wrong_lifetime(value.pv_string_utf8()) }
;
163 visitor
.visit_borrowed_str(s
)
170 Value
::Hash(value
) => visitor
.visit_map(HashAccess
::new(value
)),
171 Value
::Array(value
) => visitor
.visit_seq(ArrayAccess
::new(value
)),
172 Value
::Reference(_
) => unreachable
!(),
177 /// We use this only for `Value`s in our deserializer. We know this works because serde says the
178 /// lifetime needs to only live as long as the serializer, and we feed our serializer with the data
179 /// from a borrowed Value (keeping references to all the contained data within perl), which lives
180 /// longer than the deserializer.
181 unsafe fn str_set_wrong_lifetime
<'a
, 'b
>(s
: &'a
str) -> &'b
str {
182 std
::str::from_utf8_unchecked(std
::slice
::from_raw_parts(s
.as_ptr(), s
.len()))
185 impl<'de
, 'a
> de
::Deserializer
<'de
> for &'a
mut Deserializer
<'de
> {
188 fn deserialize_any
<V
>(self, visitor
: V
) -> Result
<V
::Value
, Error
>
192 self.deserialize_any_string(visitor
)
195 fn deserialize_bool
<V
>(self, visitor
: V
) -> Result
<V
::Value
, Error
>
200 Value
::Scalar(value
) => match value
.ty() {
201 Type
::Scalar(flags
) => {
202 use crate::scalar
::Flags
;
204 if flags
.is_empty() || flags
.intersects(Flags
::INTEGER
| Flags
::DOUBLE
) {
205 visitor
.visit_bool(unsafe { ffi::RSPL_SvTRUE(value.sv()) }
)
207 Error
::fail("expected bool value")
212 Value
::Hash(value
) => visitor
.visit_map(HashAccess
::new(value
)),
213 Value
::Array(value
) => visitor
.visit_seq(ArrayAccess
::new(value
)),
214 Value
::Reference(_
) => unreachable
!(),
218 fn deserialize_i8
<V
>(self, visitor
: V
) -> Result
<V
::Value
, Error
>
222 self.deserialize_any_iv(visitor
)
225 fn deserialize_u8
<V
>(self, visitor
: V
) -> Result
<V
::Value
, Error
>
229 self.deserialize_any_iv(visitor
)
232 fn deserialize_i16
<V
>(self, visitor
: V
) -> Result
<V
::Value
, Error
>
236 self.deserialize_any_iv(visitor
)
239 fn deserialize_u16
<V
>(self, visitor
: V
) -> Result
<V
::Value
, Error
>
243 self.deserialize_any_iv(visitor
)
246 fn deserialize_i32
<V
>(self, visitor
: V
) -> Result
<V
::Value
, Error
>
250 self.deserialize_any_iv(visitor
)
253 fn deserialize_u32
<V
>(self, visitor
: V
) -> Result
<V
::Value
, Error
>
257 self.deserialize_any_iv(visitor
)
260 fn deserialize_i64
<V
>(self, visitor
: V
) -> Result
<V
::Value
, Error
>
264 self.deserialize_any_iv(visitor
)
267 fn deserialize_u64
<V
>(self, visitor
: V
) -> Result
<V
::Value
, Error
>
271 self.deserialize_any_iv(visitor
)
274 fn deserialize_f32
<V
>(self, visitor
: V
) -> Result
<V
::Value
, Error
>
278 self.deserialize_any_nv(visitor
)
281 fn deserialize_f64
<V
>(self, visitor
: V
) -> Result
<V
::Value
, Error
>
285 self.deserialize_any_nv(visitor
)
288 fn deserialize_char
<V
>(self, visitor
: V
) -> Result
<V
::Value
, Error
>
293 Value
::Scalar(value
) => match value
.ty() {
294 Type
::Scalar(flags
) => {
295 use crate::scalar
::Flags
;
297 if flags
.contains(Flags
::INTEGER
) {
300 visitor
.visit_char(c
as u8 as char)
302 visitor
.visit_i64(c
as i64)
304 } else if flags
.contains(Flags
::DOUBLE
) {
305 visitor
.visit_f64(value
.nv())
306 } else if flags
.contains(Flags
::STRING
) {
307 let s
= value
.pv_string_utf8();
308 let mut chars
= s
.chars();
310 Some(ch
) if chars
.next().is_none() => visitor
.visit_char(ch
),
312 let s
= unsafe { str_set_wrong_lifetime(value.pv_string_utf8()) }
;
313 visitor
.visit_borrowed_str(s
)
322 Value
::Hash(value
) => visitor
.visit_map(HashAccess
::new(value
)),
323 Value
::Array(value
) => visitor
.visit_seq(ArrayAccess
::new(value
)),
324 Value
::Reference(_
) => unreachable
!(),
328 fn deserialize_str
<V
>(self, visitor
: V
) -> Result
<V
::Value
, Error
>
332 self.deserialize_any(visitor
)
335 fn deserialize_string
<V
>(self, visitor
: V
) -> Result
<V
::Value
, Error
>
339 self.deserialize_any(visitor
)
342 fn deserialize_bytes
<V
>(self, visitor
: V
) -> Result
<V
::Value
, Error
>
347 Value
::Scalar(value
) => match value
.ty() {
348 Type
::Scalar(flags
) => {
349 use crate::scalar
::Flags
;
351 if flags
.contains(Flags
::STRING
) {
352 let bytes
= value
.pv_bytes();
353 let bytes
: &'de
[u8] =
354 unsafe { std::slice::from_raw_parts(bytes.as_ptr(), bytes.len()) }
;
355 visitor
.visit_borrowed_bytes(bytes
)
356 } else if flags
.contains(Flags
::DOUBLE
) {
357 visitor
.visit_f64(value
.nv())
358 } else if flags
.contains(Flags
::INTEGER
) {
359 visitor
.visit_i64(value
.iv() as i64)
366 Value
::Hash(value
) => visitor
.visit_map(HashAccess
::new(value
)),
367 Value
::Array(value
) => visitor
.visit_seq(ArrayAccess
::new(value
)),
368 Value
::Reference(_
) => unreachable
!(),
372 fn deserialize_byte_buf
<V
>(self, visitor
: V
) -> Result
<V
::Value
, Error
>
376 self.deserialize_bytes(visitor
)
379 fn deserialize_option
<V
>(self, visitor
: V
) -> Result
<V
::Value
, Error
>
383 if self.option_allowed
{
384 if let Value
::Scalar(value
) = self.get()?
{
385 if let Type
::Scalar(flags
) = value
.ty() {
386 if flags
.is_empty() {
387 return visitor
.visit_none();
391 self.option_allowed
= false;
392 let res
= visitor
.visit_some(&mut *self);
393 self.option_allowed
= true;
396 self.deserialize_any(visitor
)
400 fn deserialize_unit
<V
>(self, visitor
: V
) -> Result
<V
::Value
, Error
>
404 self.deserialize_any(visitor
)
407 fn deserialize_unit_struct
<V
>(self, _name
: &'
static str, visitor
: V
) -> Result
<V
::Value
, Error
>
411 self.deserialize_any(visitor
)
414 fn deserialize_newtype_struct
<V
>(
418 ) -> Result
<V
::Value
, Error
>
422 self.deserialize_any(visitor
)
425 fn deserialize_seq
<V
>(self, visitor
: V
) -> Result
<V
::Value
, Error
>
429 self.deserialize_any(visitor
)
432 fn deserialize_tuple
<V
>(self, _len
: usize, visitor
: V
) -> Result
<V
::Value
, Error
>
436 self.deserialize_any(visitor
)
439 fn deserialize_tuple_struct
<V
>(
444 ) -> Result
<V
::Value
, Error
>
448 self.deserialize_any(visitor
)
451 fn deserialize_map
<V
>(self, visitor
: V
) -> Result
<V
::Value
, Error
>
455 self.deserialize_any(visitor
)
458 fn deserialize_struct
<V
>(
461 _fields
: &'
static [&'
static str],
463 ) -> Result
<V
::Value
, Error
>
467 self.deserialize_map(visitor
)
470 fn deserialize_enum
<V
>(
473 _variants
: &'
static [&'
static str],
475 ) -> Result
<V
::Value
, Error
>
479 self.deserialize_any(visitor
)
482 fn deserialize_identifier
<V
>(self, visitor
: V
) -> Result
<V
::Value
, Error
>
486 self.deserialize_any(visitor
)
489 fn deserialize_ignored_any
<V
>(self, visitor
: V
) -> Result
<V
::Value
, Error
>
493 self.deserialize_any(visitor
)
497 /// Serde `MapAccess` intermediate type.
498 pub struct HashAccess
<'a
> {
499 hash
: &'a hash
::Hash
,
505 impl<'a
> HashAccess
<'a
> {
506 pub fn new(value
: &'a hash
::Hash
) -> Self {
507 drop(value
.shared_iter()); // reset iterator
510 entry
: std
::ptr
::null_mut(),
517 impl<'de
, 'a
> MapAccess
<'de
> for HashAccess
<'a
> {
520 fn next_key_seed
<K
>(&mut self, seed
: K
) -> Result
<Option
<K
::Value
>, Error
>
522 K
: DeserializeSeed
<'de
>,
528 if self.entry
.is_null() {
529 self.entry
= unsafe { ffi::RSPL_hv_iternext(self.hash.hv()) }
;
530 if self.entry
.is_null() {
531 self.finished
= true;
534 } else if self.at_value
{
535 return Error
::fail("map access value skipped");
538 self.at_value
= true;
540 let key
= unsafe { Value::from_raw_ref(ffi::RSPL_hv_iterkeysv(self.entry)) }
;
541 seed
.deserialize(&mut Deserializer
::from_value(key
))
545 fn next_value_seed
<V
>(&mut self, seed
: V
) -> Result
<V
::Value
, Error
>
547 V
: DeserializeSeed
<'de
>,
550 return Error
::fail("map access value requested after end");
553 if self.entry
.is_null() || !self.at_value
{
554 return Error
::fail("map access key skipped");
557 self.at_value
= false;
560 unsafe { Value::from_raw_ref(ffi::RSPL_hv_iterval(self.hash.hv(), self.entry)) }
;
561 self.entry
= std
::ptr
::null_mut();
563 seed
.deserialize(&mut Deserializer
::from_value(value
))
567 /// Serde `SeqAccess` intermediate type.
568 pub struct ArrayAccess
<'a
> {
569 iter
: array
::Iter
<'a
>,
572 impl<'a
> ArrayAccess
<'a
> {
573 pub fn new(value
: &'a array
::Array
) -> Self {
574 Self { iter: value.iter() }
578 impl<'de
, 'a
> SeqAccess
<'de
> for ArrayAccess
<'a
> {
581 fn next_element_seed
<K
>(&mut self, seed
: K
) -> Result
<Option
<K
::Value
>, Error
>
583 K
: DeserializeSeed
<'de
>,
587 .map(move |value
| seed
.deserialize(&mut Deserializer
::from_value(value
)))