diff options
| -rw-r--r-- | Cargo.toml | 22 | ||||
| -rw-r--r-- | examples/csv_vectors.rs | 29 | ||||
| -rw-r--r-- | src/de/mod.rs | 4 | ||||
| -rw-r--r-- | src/de/parse.rs | 6 | ||||
| -rw-r--r-- | src/error.rs | 2 | ||||
| -rw-r--r-- | src/lib.rs | 2 | ||||
| -rw-r--r-- | src/ser.rs | 2 | 
7 files changed, 39 insertions, 28 deletions
@@ -16,19 +16,19 @@ version = "0.4.2"  repository = "samscott89/serde_qs"  [dependencies] -data-encoding = "2.0" -error-chain = "0.11.0" -dtoa = "0.4.0" -fnv = "1.0.3" -itoa = "0.3.0" -percent-encoding = "1.0.0" -serde = "1.0.1" -serde_derive = "1.0.1" +data-encoding = "2.1.2" +error-chain = "0.12.0" +dtoa = "0.4.3" +fnv = "1.0.6" +itoa = "0.4.3" +percent-encoding = "1.0.1" +serde = "1.0.85" +serde_derive = "1.0.85"  [dev-dependencies] -csv = "0.15" -rand = "0.4" -serde_urlencoded = "0.5" +csv = "1.0.5" +rand = "0.6.4" +serde_urlencoded = "0.5.4"  [lib]  test = false diff --git a/examples/csv_vectors.rs b/examples/csv_vectors.rs index 75f7945..7824cdd 100644 --- a/examples/csv_vectors.rs +++ b/examples/csv_vectors.rs @@ -4,6 +4,10 @@ extern crate serde;  extern crate serde_derive;  extern crate serde_qs as qs; +use serde::de::DeserializeOwned; + +use std::default::Default; +  #[derive(Debug, Deserialize, Serialize)]  struct Query {      #[serde(deserialize_with="from_csv")] @@ -18,17 +22,24 @@ fn main() {  } -fn from_csv<'de, D>(deserializer: D) -> Result<Vec<u8>, D::Error> +fn from_csv<'de, D, T>(deserializer: D) -> Result<Vec<T>, D::Error>      where D: serde::Deserializer<'de>, +          T: DeserializeOwned  { -    deserializer.deserialize_str(CSVVecVisitor) +    deserializer.deserialize_str(CSVVecVisitor::<T>::default())  }  /// Visits a string value of the form "v1,v2,v3" into a vector of bytes Vec<u8> -struct CSVVecVisitor; +struct CSVVecVisitor<T: DeserializeOwned>(std::marker::PhantomData<T>); + +impl<T: DeserializeOwned> Default for CSVVecVisitor<T> { +    fn default() -> Self { +        CSVVecVisitor(std::marker::PhantomData) +    } +} -impl<'de> serde::de::Visitor<'de> for CSVVecVisitor { -    type Value = Vec<u8>; +impl<'de, T: DeserializeOwned> serde::de::Visitor<'de> for CSVVecVisitor<T> { +    type Value = Vec<T>;      fn expecting(&self,                   formatter: &mut std::fmt::Formatter) @@ -40,10 +51,10 @@ impl<'de> serde::de::Visitor<'de> for CSVVecVisitor {          where E: serde::de::Error,      {          let mut output = Vec::new(); -        let mut items = csv::Reader::from_string(s); -        // let items = items.next_str(); -        while let csv::NextField::Data(item) = items.next_str() { -            output.push(u8::from_str_radix(item, 10).unwrap()); +        let mut items = csv::Reader::from_reader(s.as_bytes()); +        for res in items.deserialize() { +            let item: T = res.map_err(|e| E::custom(format!("could not deserialize sequence value: {:?}", e)))?; +            output.push(item);          }          Ok(output) diff --git a/src/de/mod.rs b/src/de/mod.rs index 5d8115a..c44ae19 100644 --- a/src/de/mod.rs +++ b/src/de/mod.rs @@ -101,8 +101,8 @@ impl Config {      /// Create a new `Config` with the specified `max_depth` and `strict` mode.      pub fn new(max_depth: usize, strict: bool) -> Self {          Self { -            max_depth: max_depth, -            strict: strict, +            max_depth, +            strict,          }      } diff --git a/src/de/parse.rs b/src/de/parse.rs index a99e96d..09552fe 100644 --- a/src/de/parse.rs +++ b/src/de/parse.rs @@ -211,8 +211,8 @@ impl<'a> Parser<'a> {              acc: (0, 0),              index: 0,              peeked: None, -            depth: depth, -            strict: strict, +            depth, +            strict,              state: ParsingState::Init,          }      } @@ -248,7 +248,7 @@ impl<'a> Parser<'a> {              _ => BTreeMap::default().into_iter(),          };          Ok(QsDeserializer { -            iter: iter, +            iter,              value: None,          })      } diff --git a/src/error.rs b/src/error.rs index aecc2d0..596f0a7 100644 --- a/src/error.rs +++ b/src/error.rs @@ -1,3 +1,5 @@ +#![allow(deprecated)] +  use data_encoding;  use serde::de; @@ -117,8 +117,6 @@      overflowing_literals,      path_statements,      plugin_as_library, -    private_no_mangle_fns, -    private_no_mangle_statics,      stable_features,      trivial_casts,      trivial_numeric_casts, @@ -93,7 +93,7 @@ pub fn to_string<T: ser::Serialize>(input: &T) -> Result<String> {  pub fn to_writer<T: ser::Serialize, W: Write>(input: &T, writer: &mut W) -> Result<()> {      let mut first = true;      input.serialize(&mut QsSerializer { -            writer: writer, +            writer,              key: None,              first: &mut first,          })  | 
