summaryrefslogtreecommitdiff
path: root/examples
diff options
context:
space:
mode:
authorSam Scott <sam.scott89@gmail.com>2019-01-21 10:54:39 -0500
committerSam Scott <sam.scott89@gmail.com>2019-01-21 10:54:39 -0500
commit527b32876823a8c4154fcbeb1146fa7da0e4ade2 (patch)
treee50d3e8e7e0fd98d5e17bc19183b24d9b71db12b /examples
parent5696a51e46649997ca346089e916b489a348386d (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.rs29
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)