serde-field-with 0.2.1

Serde field with attribute
Documentation
use alloc::boxed::Box;
use core::{fmt, str};

use serde::{
    de::{self, Deserialize as _, Deserializer},
    ser::Serializer,
};

use crate::to_and_from_string;

pub fn serialize<S, T>(this: &Option<T>, serializer: S) -> Result<S::Ok, S::Error>
where
    S: Serializer,
    T: fmt::Display,
{
    match *this {
        Some(ref t) => to_and_from_string::serialize(t, serializer),
        None => serializer.serialize_none(),
    }
}

pub fn deserialize<'de, D, T>(deserializer: D) -> Result<Option<T>, D::Error>
where
    D: Deserializer<'de>,
    T: str::FromStr,
    <T as str::FromStr>::Err: fmt::Display,
{
    match Option::<Box<str>>::deserialize(deserializer)? {
        Some(s) => T::from_str(&s).map(Some).map_err(de::Error::custom),
        None => Ok(None),
    }
}