args.rs 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. use super::{value::ValueDeserializer, Error};
  2. use crate::parser::Args;
  3. use serde::de;
  4. use std::borrow::Cow;
  5. pub struct ArgsDeserializer<'a> {
  6. pub input: Args<'a>,
  7. }
  8. impl<'de> de::Deserializer<'de> for ArgsDeserializer<'de> {
  9. type Error = Error;
  10. fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Error>
  11. where
  12. V: de::Visitor<'de>,
  13. {
  14. match self.input {
  15. Args::None => visitor.visit_none(),
  16. Args::Single(v) => {
  17. let des = ValueDeserializer { input: v };
  18. des.deserialize_any(visitor)
  19. }
  20. Args::Multiple(v) => visitor.visit_seq(SeqArgsDeserializer { input: v, id: 0 }),
  21. }
  22. }
  23. serde::forward_to_deserialize_any! {
  24. bool u8 u16 u32 u64 i8 i16 i32 i64 f32 f64 char str string seq
  25. bytes byte_buf map unit newtype_struct
  26. ignored_any unit_struct tuple_struct tuple option identifier
  27. enum struct
  28. }
  29. }
  30. pub struct SeqArgsDeserializer<'a> {
  31. pub input: Vec<Cow<'a, str>>,
  32. pub id: usize,
  33. }
  34. impl<'de> de::SeqAccess<'de> for SeqArgsDeserializer<'de> {
  35. type Error = Error;
  36. fn next_element_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>, Error>
  37. where
  38. T: de::DeserializeSeed<'de>,
  39. {
  40. let value = match self.input.get(self.id) {
  41. Some(v) => v,
  42. None => return Ok(None),
  43. };
  44. let out = seed
  45. .deserialize(ValueDeserializer {
  46. input: value.clone(),
  47. })
  48. .map(Some);
  49. self.id += 1;
  50. out
  51. }
  52. }