diff options
author | Sam Scott <sam.scott89@gmail.com> | 2019-01-23 11:13:18 -0500 |
---|---|---|
committer | Sam Scott <sam.scott89@gmail.com> | 2019-01-23 11:13:18 -0500 |
commit | b69c42eb9b9f055e74353c9c149074616eff181f (patch) | |
tree | 2cf99efcf18ae20feed9fd843771e96be0bd3b9d /src | |
parent | 6689581cfa2b9eacd6ec5d6402cb920fecf1eb63 (diff) |
Add documentation and workaroud for `#[serde(flatten)]` usage.
Diffstat (limited to 'src')
-rw-r--r-- | src/lib.rs | 48 |
1 files changed, 48 insertions, 0 deletions
@@ -97,7 +97,55 @@ //! using keys with square brackets in them, or unexpected things can //! happen. //! +//! ## Flatten workaround +//! +//! A current [known limitation](https://github.com/serde-rs/serde/issues/1183) +//! in `serde` is deserializing `#[serde(flatten)]` structs for formats which +//! are not self-describing. This includes query strings: `12` can be an integer +//! or a string, for example. +//! +//! We suggest the following workaround: +//! +//! ``` +//! extern crate serde; +//! #[macro_use] +//! extern crate serde_derive; +//! extern crate serde_qs as qs; +//! +//! use serde::de::Error; //! +//! fn from_str<'de, D, S>(deserializer: D) -> Result<S, D::Error> +//! where D: serde::Deserializer<'de>, +//! S: std::str::FromStr +//! { +//! let s = <&str as serde::Deserialize>::deserialize(deserializer)?; +//! S::from_str(&s).map_err(|_| D::Error::custom("could not parse string")) +//! } +//! +//! #[derive(Deserialize, Serialize, Debug, PartialEq)] +//! struct Query { +//! a: u8, +//! #[serde(flatten)] +//! common: CommonParams, +//! } +//! +//! #[derive(Deserialize, Serialize, Debug, PartialEq)] +//! struct CommonParams { +//! #[serde(deserialize_with="from_str")] +//! limit: u64, +//! #[serde(deserialize_with="from_str")] +//! offset: u64, +//! #[serde(deserialize_with="from_str")] +//! remaining: bool, +//! } +//! +//! fn main() { +//! let params = "a=1&limit=100&offset=50&remaining=true"; +//! let query = Query { a: 1, common: CommonParams { limit: 100, offset: 50, remaining: true } }; +//! let rec_query: Result<Query, _> = qs::from_str(params); +//! assert_eq!(rec_query.unwrap(), query); +//! } +//! ``` #![allow( )] |