1use std::fmt::Formatter;
2use std::vec::IntoIter;
3
4use anyhow::anyhow;
5use indexmap::IndexMap;
6use serde::de::{DeserializeOwned, DeserializeSeed, MapAccess, SeqAccess, Visitor};
7use serde::{de, Deserialize};
8
9use crate::{Error, Value};
10
11pub fn from_value<T: DeserializeOwned>(v: Value) -> Result<T, Error> {
25 T::deserialize(Deserializer(v))
26}
27
28pub trait FromValue {
42 fn from_value(v: Value) -> Result<Self, Error>
43 where
44 Self: Sized;
45}
46
47impl<T> FromValue for T
48where
49 T: DeserializeOwned,
50{
51 fn from_value(v: Value) -> Result<Self, Error> {
52 from_value(v)
53 }
54}
55
56struct ValueVisitor;
57
58impl<'de> Visitor<'de> for ValueVisitor {
59 type Value = Value;
60
61 fn expecting(&self, f: &mut Formatter) -> std::fmt::Result {
62 write!(f, "expecting visitor")
63 }
64
65 fn visit_bool<E>(self, v: bool) -> Result<Self::Value, E>
66 where
67 E: de::Error,
68 {
69 Ok(Value::Bool(v))
70 }
71
72 fn visit_i8<E>(self, v: i8) -> Result<Self::Value, E>
73 where
74 E: de::Error,
75 {
76 Ok(Value::I8(v))
77 }
78
79 fn visit_i16<E>(self, v: i16) -> Result<Self::Value, E>
80 where
81 E: de::Error,
82 {
83 Ok(Value::I16(v))
84 }
85
86 fn visit_i32<E>(self, v: i32) -> Result<Self::Value, E>
87 where
88 E: de::Error,
89 {
90 Ok(Value::I32(v))
91 }
92
93 fn visit_i64<E>(self, v: i64) -> Result<Self::Value, E>
94 where
95 E: de::Error,
96 {
97 Ok(Value::I64(v))
98 }
99
100 fn visit_u8<E>(self, v: u8) -> Result<Self::Value, E>
101 where
102 E: de::Error,
103 {
104 Ok(Value::U8(v))
105 }
106
107 fn visit_u16<E>(self, v: u16) -> Result<Self::Value, E>
108 where
109 E: de::Error,
110 {
111 Ok(Value::U16(v))
112 }
113
114 fn visit_u32<E>(self, v: u32) -> Result<Self::Value, E>
115 where
116 E: de::Error,
117 {
118 Ok(Value::U32(v))
119 }
120
121 fn visit_u64<E>(self, v: u64) -> Result<Self::Value, E>
122 where
123 E: de::Error,
124 {
125 Ok(Value::U64(v))
126 }
127
128 fn visit_f32<E>(self, v: f32) -> Result<Self::Value, E>
129 where
130 E: de::Error,
131 {
132 Ok(Value::F32(v))
133 }
134
135 fn visit_f64<E>(self, v: f64) -> Result<Self::Value, E>
136 where
137 E: de::Error,
138 {
139 Ok(Value::F64(v))
140 }
141
142 fn visit_char<E>(self, v: char) -> Result<Self::Value, E>
143 where
144 E: de::Error,
145 {
146 Ok(Value::Char(v))
147 }
148
149 fn visit_str<E>(self, v: &str) -> Result<Self::Value, E>
150 where
151 E: de::Error,
152 {
153 Ok(Value::Str(v.to_string()))
154 }
155
156 fn visit_borrowed_str<E>(self, v: &'de str) -> Result<Self::Value, E>
157 where
158 E: de::Error,
159 {
160 Ok(Value::Str(v.to_string()))
161 }
162
163 fn visit_string<E>(self, v: String) -> Result<Self::Value, E>
164 where
165 E: de::Error,
166 {
167 Ok(Value::Str(v))
168 }
169
170 fn visit_bytes<E>(self, v: &[u8]) -> Result<Self::Value, E>
171 where
172 E: de::Error,
173 {
174 Ok(Value::Bytes(v.to_vec()))
175 }
176
177 fn visit_borrowed_bytes<E>(self, v: &'de [u8]) -> Result<Self::Value, E>
178 where
179 E: de::Error,
180 {
181 Ok(Value::Bytes(v.to_vec()))
182 }
183
184 fn visit_byte_buf<E>(self, v: Vec<u8>) -> Result<Self::Value, E>
185 where
186 E: de::Error,
187 {
188 Ok(Value::Bytes(v))
189 }
190
191 fn visit_none<E>(self) -> Result<Self::Value, E>
192 where
193 E: de::Error,
194 {
195 Ok(Value::None)
196 }
197
198 fn visit_some<D>(self, d: D) -> Result<Self::Value, D::Error>
199 where
200 D: serde::Deserializer<'de>,
201 {
202 Ok(Value::Some(Box::new(d.deserialize_any(ValueVisitor)?)))
203 }
204
205 fn visit_unit<E>(self) -> Result<Self::Value, E>
206 where
207 E: de::Error,
208 {
209 Ok(Value::Unit)
210 }
211
212 fn visit_newtype_struct<D>(self, d: D) -> Result<Self::Value, D::Error>
213 where
214 D: serde::Deserializer<'de>,
215 {
216 Ok(Value::NewtypeStruct(
217 "",
218 Box::new(d.deserialize_any(ValueVisitor)?),
219 ))
220 }
221
222 fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error>
223 where
224 A: SeqAccess<'de>,
225 {
226 let mut vec = Vec::new();
227 while let Some(v) = seq.next_element()? {
228 vec.push(v);
229 }
230 Ok(Value::Seq(vec))
231 }
232
233 fn visit_map<A>(self, mut map: A) -> Result<Self::Value, A::Error>
234 where
235 A: MapAccess<'de>,
236 {
237 let mut im = IndexMap::new();
238 while let Some((k, v)) = map.next_entry()? {
239 im.insert(k, v);
240 }
241 Ok(Value::Map(im))
242 }
243}
244
245impl<'de> Deserialize<'de> for Value {
246 fn deserialize<D>(d: D) -> Result<Self, D::Error>
247 where
248 D: serde::Deserializer<'de>,
249 {
250 d.deserialize_any(ValueVisitor)
251 }
252}
253
254pub struct Deserializer(Value);
255
256impl<'de> serde::Deserializer<'de> for Deserializer {
257 type Error = Error;
258
259 fn deserialize_any<V>(self, vis: V) -> Result<V::Value, Self::Error>
260 where
261 V: Visitor<'de>,
262 {
263 match &self.0 {
264 Value::Bool(_) => self.deserialize_bool(vis),
265 Value::I8(_) => self.deserialize_i8(vis),
266 Value::I16(_) => self.deserialize_i16(vis),
267 Value::I32(_) => self.deserialize_i32(vis),
268 Value::I64(_) => self.deserialize_i64(vis),
269 Value::I128(_) => self.deserialize_i128(vis),
270 Value::U8(_) => self.deserialize_u8(vis),
271 Value::U16(_) => self.deserialize_u16(vis),
272 Value::U32(_) => self.deserialize_u32(vis),
273 Value::U64(_) => self.deserialize_u64(vis),
274 Value::U128(_) => self.deserialize_u128(vis),
275 Value::F32(_) => self.deserialize_f32(vis),
276 Value::F64(_) => self.deserialize_f64(vis),
277 Value::Char(_) => self.deserialize_char(vis),
278 Value::Str(_) => self.deserialize_string(vis),
279 Value::Bytes(_) => self.deserialize_byte_buf(vis),
280 Value::None => self.deserialize_option(vis),
281 Value::Some(_) => self.deserialize_option(vis),
282 Value::Unit => self.deserialize_unit(vis),
283 Value::Map(_) => self.deserialize_map(vis),
284 Value::Seq(_) => self.deserialize_seq(vis),
285 Value::Struct(_, _) => self.deserialize_map(vis),
286 v => unimplemented!("deserialize_any for {:?}", v),
287 }
288 }
289
290 fn deserialize_bool<V>(self, vis: V) -> Result<V::Value, Self::Error>
291 where
292 V: Visitor<'de>,
293 {
294 match self.0 {
295 Value::Bool(v) => vis.visit_bool(v),
296 v => Err(Error(anyhow!("invalid type: {:?}", v))),
297 }
298 }
299
300 fn deserialize_i8<V>(self, vis: V) -> Result<V::Value, Self::Error>
301 where
302 V: Visitor<'de>,
303 {
304 match self.0 {
305 Value::I8(v) => vis.visit_i8(v),
306 Value::I16(v) => vis.visit_i8(i8::try_from(v)?),
307 Value::I32(v) => vis.visit_i8(i8::try_from(v)?),
308 Value::I64(v) => vis.visit_i8(i8::try_from(v)?),
309 Value::I128(v) => vis.visit_i8(i8::try_from(v)?),
310 Value::U8(v) => vis.visit_i8(i8::try_from(v)?),
311 Value::U16(v) => vis.visit_i8(i8::try_from(v)?),
312 Value::U32(v) => vis.visit_i8(i8::try_from(v)?),
313 Value::U64(v) => vis.visit_i8(i8::try_from(v)?),
314 Value::U128(v) => vis.visit_i8(i8::try_from(v)?),
315 v => Err(Error(anyhow!("invalid type: {:?}, expect i8", v))),
316 }
317 }
318
319 fn deserialize_i16<V>(self, vis: V) -> Result<V::Value, Self::Error>
320 where
321 V: Visitor<'de>,
322 {
323 match self.0 {
324 Value::I8(v) => vis.visit_i16(i16::from(v)),
325 Value::I16(v) => vis.visit_i16(v),
326 Value::I32(v) => vis.visit_i16(i16::try_from(v)?),
327 Value::I64(v) => vis.visit_i16(i16::try_from(v)?),
328 Value::I128(v) => vis.visit_i16(i16::try_from(v)?),
329 Value::U8(v) => vis.visit_i16(i16::from(v)),
330 Value::U16(v) => vis.visit_i16(i16::try_from(v)?),
331 Value::U32(v) => vis.visit_i16(i16::try_from(v)?),
332 Value::U64(v) => vis.visit_i16(i16::try_from(v)?),
333 Value::U128(v) => vis.visit_i16(i16::try_from(v)?),
334 v => Err(Error(anyhow!("invalid type: {:?}, expect i16", v))),
335 }
336 }
337
338 fn deserialize_i32<V>(self, vis: V) -> Result<V::Value, Self::Error>
339 where
340 V: Visitor<'de>,
341 {
342 match self.0 {
343 Value::I8(v) => vis.visit_i32(i32::from(v)),
344 Value::I16(v) => vis.visit_i32(i32::from(v)),
345 Value::I32(v) => vis.visit_i32(v),
346 Value::I64(v) => vis.visit_i32(i32::try_from(v)?),
347 Value::I128(v) => vis.visit_i32(i32::try_from(v)?),
348 Value::U8(v) => vis.visit_i32(i32::from(v)),
349 Value::U16(v) => vis.visit_i32(i32::from(v)),
350 Value::U32(v) => vis.visit_i32(i32::try_from(v)?),
351 Value::U64(v) => vis.visit_i32(i32::try_from(v)?),
352 Value::U128(v) => vis.visit_i32(i32::try_from(v)?),
353 v => Err(Error(anyhow!("invalid type: {:?}", v))),
354 }
355 }
356
357 fn deserialize_i64<V>(self, vis: V) -> Result<V::Value, Self::Error>
358 where
359 V: Visitor<'de>,
360 {
361 match self.0 {
362 Value::I8(v) => vis.visit_i64(i64::from(v)),
363 Value::I16(v) => vis.visit_i64(i64::from(v)),
364 Value::I32(v) => vis.visit_i64(i64::from(v)),
365 Value::I64(v) => vis.visit_i64(v),
366 Value::I128(v) => vis.visit_i64(i64::try_from(v)?),
367 Value::U8(v) => vis.visit_i64(i64::from(v)),
368 Value::U16(v) => vis.visit_i32(i32::from(v)),
369 Value::U32(v) => vis.visit_i64(i64::from(v)),
370 Value::U64(v) => vis.visit_i64(i64::try_from(v)?),
371 Value::U128(v) => vis.visit_i64(i64::try_from(v)?),
372 v => Err(Error(anyhow!("invalid type: {:?}, expect i64", v))),
373 }
374 }
375
376 fn deserialize_u8<V>(self, vis: V) -> Result<V::Value, Self::Error>
377 where
378 V: Visitor<'de>,
379 {
380 match self.0 {
381 Value::I8(v) => vis.visit_u8(u8::try_from(v)?),
382 Value::I16(v) => vis.visit_u8(u8::try_from(v)?),
383 Value::I32(v) => vis.visit_u8(u8::try_from(v)?),
384 Value::I64(v) => vis.visit_u8(u8::try_from(v)?),
385 Value::I128(v) => vis.visit_u8(u8::try_from(v)?),
386 Value::U8(v) => vis.visit_u8(v),
387 Value::U16(v) => vis.visit_u8(u8::try_from(v)?),
388 Value::U32(v) => vis.visit_u8(u8::try_from(v)?),
389 Value::U64(v) => vis.visit_u8(u8::try_from(v)?),
390 Value::U128(v) => vis.visit_u8(u8::try_from(v)?),
391 v => Err(Error(anyhow!("invalid type: {:?}, expect u8", v))),
392 }
393 }
394
395 fn deserialize_u16<V>(self, vis: V) -> Result<V::Value, Self::Error>
396 where
397 V: Visitor<'de>,
398 {
399 match self.0 {
400 Value::I8(v) => vis.visit_u16(u16::try_from(v)?),
401 Value::I16(v) => vis.visit_u16(u16::try_from(v)?),
402 Value::I32(v) => vis.visit_u16(u16::try_from(v)?),
403 Value::I64(v) => vis.visit_u16(u16::try_from(v)?),
404 Value::I128(v) => vis.visit_u16(u16::try_from(v)?),
405 Value::U8(v) => vis.visit_u16(u16::from(v)),
406 Value::U16(v) => vis.visit_u16(v),
407 Value::U32(v) => vis.visit_u16(u16::try_from(v)?),
408 Value::U64(v) => vis.visit_u16(u16::try_from(v)?),
409 Value::U128(v) => vis.visit_u16(u16::try_from(v)?),
410 v => Err(Error(anyhow!("invalid type: {:?}, expect u16", v))),
411 }
412 }
413
414 fn deserialize_u32<V>(self, vis: V) -> Result<V::Value, Self::Error>
415 where
416 V: Visitor<'de>,
417 {
418 match self.0 {
419 Value::I8(v) => vis.visit_u32(u32::try_from(v)?),
420 Value::I16(v) => vis.visit_u32(u32::try_from(v)?),
421 Value::I32(v) => vis.visit_u32(u32::try_from(v)?),
422 Value::I64(v) => vis.visit_u32(u32::try_from(v)?),
423 Value::I128(v) => vis.visit_u32(u32::try_from(v)?),
424 Value::U8(v) => vis.visit_u32(u32::from(v)),
425 Value::U16(v) => vis.visit_u32(u32::from(v)),
426 Value::U32(v) => vis.visit_u32(v),
427 Value::U64(v) => vis.visit_u32(u32::try_from(v)?),
428 Value::U128(v) => vis.visit_u32(u32::try_from(v)?),
429 v => Err(Error(anyhow!("invalid type: {:?}, expect u32", v))),
430 }
431 }
432
433 fn deserialize_u64<V>(self, vis: V) -> Result<V::Value, Self::Error>
434 where
435 V: Visitor<'de>,
436 {
437 match self.0 {
438 Value::I8(v) => vis.visit_u64(u64::try_from(v)?),
439 Value::I16(v) => vis.visit_u64(u64::try_from(v)?),
440 Value::I32(v) => vis.visit_u64(u64::try_from(v)?),
441 Value::I64(v) => vis.visit_u64(u64::try_from(v)?),
442 Value::I128(v) => vis.visit_u64(u64::try_from(v)?),
443 Value::U8(v) => vis.visit_u64(u64::from(v)),
444 Value::U16(v) => vis.visit_u64(u64::from(v)),
445 Value::U32(v) => vis.visit_u64(u64::from(v)),
446 Value::U64(v) => vis.visit_u64(v),
447 Value::U128(v) => vis.visit_u64(u64::try_from(v)?),
448 v => Err(Error(anyhow!("invalid type: {:?}, expect u64", v))),
449 }
450 }
451
452 fn deserialize_f32<V>(self, vis: V) -> Result<V::Value, Self::Error>
453 where
454 V: Visitor<'de>,
455 {
456 match self.0 {
457 Value::F32(v) => vis.visit_f32(v),
458 Value::F64(v) => vis.visit_f32(v as f32),
459 v => Err(Error(anyhow!("invalid type: {:?}, expect f32", v))),
460 }
461 }
462
463 fn deserialize_f64<V>(self, vis: V) -> Result<V::Value, Self::Error>
464 where
465 V: Visitor<'de>,
466 {
467 match self.0 {
468 Value::F32(v) => vis.visit_f64(f64::from(v)),
469 Value::F64(v) => vis.visit_f64(v),
470 v => Err(Error(anyhow!("invalid type: {:?}, expect f64", v))),
471 }
472 }
473
474 fn deserialize_char<V>(self, vis: V) -> Result<V::Value, Self::Error>
475 where
476 V: Visitor<'de>,
477 {
478 match self.0 {
479 Value::Char(v) => vis.visit_char(v),
480 v => Err(Error(anyhow!("invalid type: {:?}, expect char", v))),
481 }
482 }
483
484 fn deserialize_str<V>(self, vis: V) -> Result<V::Value, Self::Error>
485 where
486 V: Visitor<'de>,
487 {
488 match self.0 {
489 Value::Str(v) => vis.visit_string(v),
490 v => Err(Error(anyhow!("invalid type: {:?}, expect str", v))),
491 }
492 }
493
494 fn deserialize_string<V>(self, vis: V) -> Result<V::Value, Self::Error>
495 where
496 V: Visitor<'de>,
497 {
498 match self.0 {
499 Value::Str(v) => vis.visit_string(v),
500 v => Err(Error(anyhow!("invalid type: {:?}, expect string", v))),
501 }
502 }
503
504 fn deserialize_bytes<V>(self, vis: V) -> Result<V::Value, Self::Error>
505 where
506 V: Visitor<'de>,
507 {
508 match self.0 {
509 Value::Bytes(v) => vis.visit_byte_buf(v),
510 v => Err(Error(anyhow!("invalid type: {:?}, expect bytes", v))),
511 }
512 }
513
514 fn deserialize_byte_buf<V>(self, vis: V) -> Result<V::Value, Self::Error>
515 where
516 V: Visitor<'de>,
517 {
518 match self.0 {
519 Value::Bytes(v) => vis.visit_byte_buf(v),
520 v => Err(Error(anyhow!("invalid type: {:?}, expect bytes_buf", v))),
521 }
522 }
523
524 fn deserialize_option<V>(self, vis: V) -> Result<V::Value, Self::Error>
525 where
526 V: Visitor<'de>,
527 {
528 match self.0 {
529 Value::None => vis.visit_none(),
530 Value::Some(v) => vis.visit_some(Deserializer(*v)),
531 v => Err(Error(anyhow!("invalid type: {:?}, expect option", v))),
532 }
533 }
534
535 fn deserialize_unit<V>(self, vis: V) -> Result<V::Value, Self::Error>
536 where
537 V: Visitor<'de>,
538 {
539 match self.0 {
540 Value::Unit => vis.visit_unit(),
541 v => Err(Error(anyhow!("invalid type: {:?}, expect unit", v))),
542 }
543 }
544
545 fn deserialize_unit_struct<V>(self, name: &'static str, vis: V) -> Result<V::Value, Self::Error>
546 where
547 V: Visitor<'de>,
548 {
549 match self.0 {
550 Value::UnitStruct(vn) if vn == name => vis.visit_unit(),
551 v => Err(Error(anyhow!("invalid type: {:?}, expect unit struct", v))),
552 }
553 }
554
555 fn deserialize_newtype_struct<V>(
556 self,
557 name: &'static str,
558 vis: V,
559 ) -> Result<V::Value, Self::Error>
560 where
561 V: Visitor<'de>,
562 {
563 match self.0 {
564 Value::NewtypeStruct(vn, vv) if vn == name => {
565 vis.visit_newtype_struct(Deserializer(*vv))
566 }
567 v => Err(Error(anyhow!(
568 "invalid type: {:?}, expect newtype struct",
569 v
570 ))),
571 }
572 }
573
574 fn deserialize_seq<V>(self, vis: V) -> Result<V::Value, Self::Error>
575 where
576 V: Visitor<'de>,
577 {
578 match self.0 {
579 Value::Tuple(v) => vis.visit_seq(SeqAccessor::new(v)),
580 Value::Seq(v) => vis.visit_seq(SeqAccessor::new(v)),
581 v => Err(Error(anyhow!("invalid type: {:?}, expect seq", v))),
582 }
583 }
584
585 fn deserialize_tuple<V>(self, len: usize, vis: V) -> Result<V::Value, Self::Error>
586 where
587 V: Visitor<'de>,
588 {
589 match self.0 {
590 Value::Tuple(v) if len == v.len() => vis.visit_seq(SeqAccessor::new(v)),
591 Value::Seq(v) if len == v.len() => vis.visit_seq(SeqAccessor::new(v)),
592 v => Err(Error(anyhow!("invalid type: {:?}, expect tuple", v))),
593 }
594 }
595
596 fn deserialize_tuple_struct<V>(
597 self,
598 name: &'static str,
599 len: usize,
600 vis: V,
601 ) -> Result<V::Value, Self::Error>
602 where
603 V: Visitor<'de>,
604 {
605 match self.0 {
606 Value::TupleStruct(vn, vf) if name == vn && len == vf.len() => {
607 vis.visit_seq(SeqAccessor::new(vf))
608 }
609 v => Err(Error(anyhow!("invalid type: {:?}, expect tuple struct", v))),
610 }
611 }
612
613 fn deserialize_map<V>(self, vis: V) -> Result<V::Value, Self::Error>
614 where
615 V: Visitor<'de>,
616 {
617 match self.0 {
618 Value::Map(v) => vis.visit_map(MapAccessor::new(v)),
619 v => Err(Error(anyhow!("invalid type: {:?}, expect map", v))),
620 }
621 }
622
623 fn deserialize_struct<V>(
624 self,
625 name: &'static str,
626 fields: &'static [&'static str],
627 vis: V,
628 ) -> Result<V::Value, Self::Error>
629 where
630 V: Visitor<'de>,
631 {
632 match self.0 {
633 Value::Struct(vn, mut vf) if vn == name => {
634 let mut vs = Vec::with_capacity(fields.len());
635 for key in fields {
636 match vf.shift_remove(key) {
640 Some(v) => vs.push(v),
641 None => return Err(Error(anyhow!("field not exist"))),
642 }
643 }
644 vis.visit_seq(SeqAccessor::new(vs))
645 }
646 Value::Map(fields) => vis.visit_map(MapAccessor::new(fields)),
647 v => Err(Error(anyhow!("invalid type: {:?}, expect struct", v))),
648 }
649 }
650
651 fn deserialize_enum<V>(
652 self,
653 name: &'static str,
654 variants: &'static [&'static str],
655 vis: V,
656 ) -> Result<V::Value, Self::Error>
657 where
658 V: Visitor<'de>,
659 {
660 vis.visit_enum(EnumAccessor::new(name, variants, self.0))
661 }
662
663 fn deserialize_identifier<V>(self, vis: V) -> Result<V::Value, Self::Error>
664 where
665 V: Visitor<'de>,
666 {
667 self.deserialize_str(vis)
668 }
669
670 fn deserialize_ignored_any<V>(self, vis: V) -> Result<V::Value, Self::Error>
671 where
672 V: Visitor<'de>,
673 {
674 self.deserialize_any(vis)
675 }
676}
677
678impl From<Value> for Deserializer {
679 fn from(v: Value) -> Self {
680 Self(v)
681 }
682}
683
684struct SeqAccessor {
685 elements: IntoIter<Value>,
686}
687
688impl SeqAccessor {
689 fn new(elements: Vec<Value>) -> Self {
690 Self {
691 elements: elements.into_iter(),
692 }
693 }
694}
695
696impl<'de> de::SeqAccess<'de> for SeqAccessor {
697 type Error = Error;
698
699 fn next_element_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>, Self::Error>
700 where
701 T: DeserializeSeed<'de>,
702 {
703 match self.elements.next() {
704 None => Ok(None),
705 Some(v) => Ok(Some(seed.deserialize(Deserializer(v))?)),
706 }
707 }
708}
709
710struct MapAccessor {
711 cache_value: Option<Value>,
712 entries: indexmap::map::IntoIter<Value, Value>,
713}
714
715impl MapAccessor {
716 fn new(entries: IndexMap<Value, Value>) -> Self {
717 Self {
718 cache_value: None,
719 entries: entries.into_iter(),
720 }
721 }
722}
723impl<'de> de::MapAccess<'de> for MapAccessor {
724 type Error = Error;
725
726 fn next_key_seed<K>(&mut self, seed: K) -> Result<Option<K::Value>, Self::Error>
727 where
728 K: DeserializeSeed<'de>,
729 {
730 debug_assert!(
731 self.cache_value.is_none(),
732 "value for the last entry is not deserialized"
733 );
734
735 match self.entries.next() {
736 None => Ok(None),
737 Some((k, v)) => {
738 self.cache_value = Some(v);
739 Ok(Some(seed.deserialize(Deserializer(k))?))
740 }
741 }
742 }
743
744 fn next_value_seed<V>(&mut self, seed: V) -> Result<V::Value, Self::Error>
745 where
746 V: DeserializeSeed<'de>,
747 {
748 let value = self
749 .cache_value
750 .take()
751 .expect("value for current entry is missing");
752 seed.deserialize(Deserializer(value))
753 }
754}
755
756struct EnumAccessor {
757 name: &'static str,
758 variants: &'static [&'static str],
759 value: Value,
760}
761
762impl EnumAccessor {
763 fn new(name: &'static str, variants: &'static [&'static str], value: Value) -> Self {
764 Self {
765 name,
766 variants,
767 value,
768 }
769 }
770}
771
772impl<'de> de::EnumAccess<'de> for EnumAccessor {
773 type Error = Error;
774 type Variant = VariantAccessor;
775
776 fn variant_seed<V>(self, seed: V) -> Result<(V::Value, Self::Variant), Self::Error>
777 where
778 V: DeserializeSeed<'de>,
779 {
780 let value = match &self.value {
781 Value::UnitVariant {
782 name: vn,
783 variant_index: vvi,
784 variant: vv,
785 } if &self.name == vn && &self.variants[*vvi as usize] == vv => {
786 seed.deserialize(Deserializer(Value::Str(vv.to_string())))?
787 }
788 Value::TupleVariant {
789 name: vn,
790 variant_index: vvi,
791 variant: vv,
792 ..
793 } if &self.name == vn && &self.variants[*vvi as usize] == vv => {
794 seed.deserialize(Deserializer(Value::Str(vv.to_string())))?
795 }
796 Value::StructVariant {
797 name: vn,
798 variant_index: vvi,
799 variant: vv,
800 ..
801 } if &self.name == vn && &self.variants[*vvi as usize] == vv => {
802 seed.deserialize(Deserializer(Value::Str(vv.to_string())))?
803 }
804 Value::NewtypeVariant {
805 name: vn,
806 variant_index: vvi,
807 variant: vv,
808 ..
809 } if &self.name == vn && &self.variants[*vvi as usize] == vv => {
810 seed.deserialize(Deserializer(Value::Str(vv.to_string())))?
811 }
812 _ => return Err(Error(anyhow!("invalid type"))),
813 };
814
815 Ok((value, VariantAccessor::new(self.value)))
816 }
817}
818
819struct VariantAccessor {
820 value: Value,
821}
822
823impl VariantAccessor {
824 fn new(value: Value) -> Self {
825 Self { value }
826 }
827}
828
829impl<'de> de::VariantAccess<'de> for VariantAccessor {
830 type Error = Error;
831
832 fn unit_variant(self) -> Result<(), Self::Error> {
833 match self.value {
834 Value::UnitVariant { .. } => Ok(()),
835 _ => Err(Error(anyhow!("invalid type"))),
836 }
837 }
838
839 fn newtype_variant_seed<T>(self, seed: T) -> Result<T::Value, Self::Error>
840 where
841 T: DeserializeSeed<'de>,
842 {
843 match self.value {
844 Value::NewtypeVariant { value, .. } => Ok(seed.deserialize(Deserializer(*value))?),
845 _ => Err(Error(anyhow!("invalid type"))),
846 }
847 }
848
849 fn tuple_variant<V>(self, len: usize, vis: V) -> Result<V::Value, Self::Error>
850 where
851 V: Visitor<'de>,
852 {
853 match self.value {
854 Value::TupleVariant { fields, .. } if len == fields.len() => {
855 vis.visit_seq(SeqAccessor::new(fields))
856 }
857 _ => Err(Error(anyhow!("invalid type"))),
858 }
859 }
860
861 fn struct_variant<V>(
862 self,
863 fields: &'static [&'static str],
864 vis: V,
865 ) -> Result<V::Value, Self::Error>
866 where
867 V: Visitor<'de>,
868 {
869 match self.value {
870 Value::Struct(_, mut vf) => {
871 let mut vs = Vec::with_capacity(fields.len());
872 for key in fields {
873 match vf.shift_remove(key) {
877 Some(v) => vs.push(v),
878 None => return Err(Error(anyhow!("field not exist"))),
879 }
880 }
881 vis.visit_seq(SeqAccessor::new(vs))
882 }
883 _ => Err(Error(anyhow!("invalid type"))),
884 }
885 }
886}
887
888#[cfg(test)]
889mod tests {
890 use anyhow::Result;
891 use indexmap::indexmap;
892
893 use super::*;
894 use crate::de::from_value;
895
896 #[derive(Debug, PartialEq, serde::Deserialize)]
897 struct TestStruct {
898 a: bool,
899 b: i32,
900 c: u64,
901 d: String,
902 e: f64,
903 }
904
905 #[test]
906 fn test_from_value() {
907 let v: bool = from_value(Value::Bool(true)).expect("must success");
908 assert!(v);
909
910 let v: TestStruct = from_value(Value::Struct(
911 "TestStruct",
912 indexmap! {
913 "a" => Value::Bool(true),
914 "b" => Value::I32(1),
915 "c" => Value::U64(2),
916 "d" => Value::Str("Hello, World!".to_string()),
917 "e" => Value::F64(4.5)
918 },
919 ))
920 .expect("must success");
921 assert_eq!(
922 v,
923 TestStruct {
924 a: true,
925 b: 1,
926 c: 2,
927 d: "Hello, World!".to_string(),
928 e: 4.5
929 }
930 )
931 }
932
933 #[test]
934 fn test_deserialize() -> Result<()> {
935 let content = r#"{
936 "a": true,
937 "b": 1,
938 "c": 2,
939 "d": "Hello, World!",
940 "e": 4.5
941 }"#;
942 let raw: TestStruct = serde_json::from_str(content)?;
943 let value: Value = serde_json::from_str(content)?;
944 println!("{:?}", value);
945
946 assert_eq!(TestStruct::from_value(value)?, raw);
947
948 Ok(())
949 }
950}