solscan 0.1.1

A Rust Solscan HTTP API client
Documentation
use serde::{Deserialize, Deserializer, Serializer};
use std::{fmt::Display, str::FromStr};

pub fn serialize<T: ToString, S: Serializer>(value: T, s: S) -> Result<S::Ok, S::Error> {
    s.serialize_str(&value.to_string())
}

pub fn deserialize<'de, E, T, D>(d: D) -> Result<T, D::Error>
where
    T: FromStr<Err = E>,
    E: Display,
    D: Deserializer<'de>,
{
    String::deserialize(d).and_then(|s| T::from_str(&s).map_err(serde::de::Error::custom))
}

pub mod option {
    use super::*;

    pub fn serialize<T: ToString, S: Serializer>(
        value: &Option<T>,
        s: S,
    ) -> Result<S::Ok, S::Error> {
        if let Some(value) = value {
            s.serialize_some(&value.to_string())
        } else {
            s.serialize_none()
        }
    }

    pub fn deserialize<'de, E, T, D>(d: D) -> Result<Option<T>, D::Error>
    where
        T: FromStr<Err = E>,
        E: Display,
        D: Deserializer<'de>,
    {
        match <Option<String>>::deserialize(d) {
            Ok(Some(s)) => {
                if s.is_empty() {
                    Ok(None)
                } else {
                    match T::from_str(&s) {
                        Ok(x) => Ok(Some(x)),
                        Err(e) => Err(serde::de::Error::custom(e)),
                    }
                }
            }
            Ok(None) => Ok(None),
            Err(e) => Err(e),
        }
    }
}

pub mod vec {
    use super::*;
    use serde::ser::SerializeSeq;

    pub fn serialize<T: ToString, S: Serializer>(value: &Vec<T>, s: S) -> Result<S::Ok, S::Error> {
        let mut seq = s.serialize_seq(Some(value.len()))?;
        for value in value {
            seq.serialize_element(&value.to_string())?;
        }
        seq.end()
    }

    pub fn deserialize<'de, E, T, D>(d: D) -> Result<Vec<T>, D::Error>
    where
        T: FromStr<Err = E>,
        E: Display,
        D: Deserializer<'de>,
    {
        <Vec<String>>::deserialize(d).and_then(|v| {
            v.into_iter()
                .map(|s| T::from_str(&s))
                .collect::<Result<Vec<T>, _>>()
                .map_err(serde::de::Error::custom)
        })
    }
}