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.1" 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; @@ -89,8 +89,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, }) |