cetus-utils 0.1.0

The utils of cetus clmmpool
Documentation
use core::fmt;
use serde::{Deserialize, Serialize, Serializer};

#[derive(Debug, Clone, Default, Deserialize)]
pub struct I64 {
    pub bits: u64,
}

impl I64 {
    pub fn as_i64(&self) -> i64 {
        self.bits as i64
    }

    pub fn inner_to(&self) -> i64 {
        self.bits as i64
    }
}

impl From<i64> for I64 {
    fn from(d: i64) -> Self {
        Self { bits: (d as u64) }
    }
}

impl From<i32> for I64 {
    fn from(d: i32) -> Self {
        Self { bits: (d as u64) }
    }
}

impl From<I64> for i64 {
    fn from(d: I64) -> Self {
        d.bits as i64
    }
}

impl fmt::Display for I64 {
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
        write!(f, "{}", self.inner_to())
    }
}

impl Serialize for I64 {
    fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
        self.as_i64().to_string().serialize(serializer)
    }
}

#[derive(Debug, Clone, Default, Deserialize)]
pub struct I128 {
    pub bits: u128,
}

impl I128 {
    pub fn as_i128(&self) -> i128 {
        self.bits as i128
    }

    pub fn inner_to(&self) -> i128 {
        self.bits as i128
    }
}

impl From<i128> for I128 {
    fn from(d: i128) -> Self {
        Self { bits: (d as u128) }
    }
}

impl From<I128> for i128 {
    fn from(d: I128) -> Self {
        d.bits as i128
    }
}

impl fmt::Display for I128 {
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
        write!(f, "{}", self.inner_to())
    }
}

impl Serialize for I128 {
    fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
        self.as_i128().to_string().serialize(serializer)
    }
}

mod test {
    #[test]
    fn test_i64_desearialize() {
        use super::I64;
        let data = r#"
            {
                "bits": "17446744073709551617"
            }
        "#;
        let v: I64 = serde_json::from_str(data).unwrap();
        assert_eq!(v.as_i64(), -999999999999999999);

        let data = r#"
            {
                "bits": "10000000000"
            }
        "#;
        let v: I64 = serde_json::from_str(data).unwrap();
        assert_eq!(v.as_i64(), 10000000000);

        let data = r#"
            {
                "bits": "0"
            }
        "#;
        let v: I64 = serde_json::from_str(data).unwrap();
        assert_eq!(v.as_i64(), 0);

        let data = r#"
            {
                "bits": "9223372036854775807"
            }
        "#;
        let v: I64 = serde_json::from_str(data).unwrap();
        assert_eq!(v.as_i64(), 9223372036854775807);

        let data = r#"
            {
                "bits": "9223372036854775808"
            }
        "#;
        let v: I64 = serde_json::from_str(data).unwrap();
        assert_eq!(v.as_i64(), -9223372036854775808);
    }

    #[test]
    fn test_i64_from() {
        use super::I64;
        assert_eq!(I64::from(0i32).as_i64(), 0i64);
        assert_eq!(I64::from(-12i32).as_i64(), -12i64);
        assert_eq!(I64::from(i32::MIN).as_i64(), i32::MIN as i64);
        assert_eq!(I64::from(i32::MAX).as_i64(), i32::MAX as i64);

        assert_eq!(I64::from(-12i64).as_i64(), -12i64);
        assert_eq!(I64::from(i64::MIN).as_i64(), i64::MIN as i64);
        assert_eq!(I64::from(i64::MAX).as_i64(), i64::MAX as i64);
    }
}