bookdata/util/
serde_string.rs

1//! Utility module for serializing with to/from string.
2//!
3//! This module is designed to be used with `#[serde(with)]`, as in:
4//!
5//! ```
6//! # use serde::{Deserialize, Serialize};
7//! # use serde_json::{to_value, json};
8//! #[derive(Serialize, Deserialize, Debug)]
9//! struct MyStruct {
10//!   #[serde(with="bookdata::util::serde_string")]
11//!   value: u64
12//! }
13//!
14//! let jsv = to_value(MyStruct { value: 72 }).unwrap();
15//! assert_eq!(jsv, json!({
16//!   "value": "72"
17//! }));
18//! ```
19//!
20//! It will use [ToString] and [FromStr] to serialize and deserialize the data.
21//!
22// This isn't currently in use anywhere.
23#![allow(dead_code)]
24use std::fmt;
25use std::marker::PhantomData;
26use std::str::FromStr;
27
28use serde::{de, Deserializer, Serializer};
29
30pub fn serialize<S, T: ToString>(v: &T, ser: S) -> Result<S::Ok, S::Error>
31where
32    S: Serializer,
33{
34    let vs = v.to_string();
35    ser.serialize_str(vs.as_str())
36}
37
38struct FromStrVisitor<T> {
39    _ph: PhantomData<T>,
40}
41
42pub fn deserialize<'de, D, T: FromStr>(de: D) -> Result<T, D::Error>
43where
44    D: Deserializer<'de>,
45{
46    de.deserialize_str(FromStrVisitor { _ph: PhantomData })
47}
48
49impl<'de, T: FromStr> de::Visitor<'de> for FromStrVisitor<T> {
50    type Value = T;
51
52    fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
53        write!(formatter, "a parsable string")
54    }
55
56    fn visit_str<E: de::Error>(self, s: &str) -> Result<Self::Value, E> {
57        s.parse()
58            .map_err(|_e| de::Error::invalid_value(de::Unexpected::Str(s), &self))
59    }
60}