diff options
author | Sam Scott <sam.scott89@gmail.com> | 2019-01-21 10:54:39 -0500 |
---|---|---|
committer | Sam Scott <sam.scott89@gmail.com> | 2019-01-21 10:54:39 -0500 |
commit | 527b32876823a8c4154fcbeb1146fa7da0e4ade2 (patch) | |
tree | e50d3e8e7e0fd98d5e17bc19183b24d9b71db12b /examples | |
parent | 5696a51e46649997ca346089e916b489a348386d (diff) |
Minor fixes:
- Suppress deprecated warning from error-chain
- Fix clippy issues
- Update dependencies
- Update example to csv 1.0
Diffstat (limited to 'examples')
-rw-r--r-- | examples/csv_vectors.rs | 29 |
1 files changed, 20 insertions, 9 deletions
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) |