pyth-lazer-protocol 0.28.0

Pyth Lazer SDK - protocol types.
Documentation
pub mod option_price {
    use {
        crate::price::Price,
        serde::{Deserialize, Deserializer, Serialize, Serializer, de::Error},
        std::num::NonZeroI64,
    };

    pub fn serialize<S>(value: &Option<Price>, serializer: S) -> Result<S::Ok, S::Error>
    where
        S: Serializer,
    {
        value
            .map(|price| price.mantissa_i64().to_string())
            .serialize(serializer)
    }

    pub fn deserialize<'de, D>(deserializer: D) -> Result<Option<Price>, D::Error>
    where
        D: Deserializer<'de>,
    {
        let value = Option::<&str>::deserialize(deserializer)?;
        if let Some(value) = value {
            let value: i64 = value.parse().map_err(D::Error::custom)?;
            let value = NonZeroI64::new(value).ok_or_else(|| D::Error::custom("zero price"))?;
            Ok(Some(Price::from_nonzero_mantissa(value)))
        } else {
            Ok(None)
        }
    }
}

pub mod timestamp {
    use {
        crate::time::TimestampUs,
        serde::{Deserialize, Deserializer, Serialize, Serializer, de::Error},
    };

    pub fn serialize<S>(value: &TimestampUs, serializer: S) -> Result<S::Ok, S::Error>
    where
        S: Serializer,
    {
        value.as_micros().to_string().serialize(serializer)
    }

    pub fn deserialize<'de, D>(deserializer: D) -> Result<TimestampUs, D::Error>
    where
        D: Deserializer<'de>,
    {
        let value = String::deserialize(deserializer)?;
        let value: u64 = value.parse().map_err(D::Error::custom)?;
        Ok(TimestampUs::from_micros(value))
    }
}