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);
}
}