1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58
pub use options_common::{Decimal, ExpirationDate, OptionType}; pub mod string_serialize { use std::fmt::Display; use std::str::FromStr; use serde::{de, Deserialize, Deserializer, Serializer}; pub fn serialize<T, S>(value: &T, serializer: S) -> Result<S::Ok, S::Error> where T: Display, S: Serializer, { serializer.collect_str(value) } pub fn deserialize<'de, T, D>(deserializer: D) -> Result<T, D::Error> where T: FromStr, T::Err: Display, D: Deserializer<'de>, { String::deserialize(deserializer)? .parse() .map_err(de::Error::custom) } } pub mod optional_string_serialize { use std::fmt::Display; use std::str::FromStr; use serde::{de, Deserialize, Deserializer, Serializer}; pub fn serialize<T, S>(value: &Option<T>, serializer: S) -> Result<S::Ok, S::Error> where T: Display, S: Serializer, { match value { Some(value) => serializer.serialize_some(&value.to_string()), None => serializer.serialize_none(), } } pub fn deserialize<'de, T, D>(deserializer: D) -> Result<Option<T>, D::Error> where T: FromStr, T::Err: Display, D: Deserializer<'de>, { let string: Option<String> = Option::deserialize(deserializer)?; string .map(|s| s.parse().map_err(de::Error::custom)) .transpose() } }