From 8fa6dd4f1c9ba6d8ccfff6cb306df2bc3cdcec56 Mon Sep 17 00:00:00 2001 From: paulobressan Date: Fri, 6 Oct 2023 12:03:31 -0300 Subject: [PATCH] fix: enabled value for convert to string or int --- src/model.rs | 48 ++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 44 insertions(+), 4 deletions(-) diff --git a/src/model.rs b/src/model.rs index 23da94f1..50a9e9af 100644 --- a/src/model.rs +++ b/src/model.rs @@ -2,11 +2,16 @@ use std::fmt::Display; use merge::Merge; -use serde::{de::Error as DeError, Deserialize, Deserializer, Serialize, Serializer}; +use serde::{ + de::{Error as DeError, Visitor}, + Deserialize, Deserializer, Serialize, Serializer, +}; use serde_json::Value as JsonValue; use strum_macros::Display; +const JSON_MAX_SAFE_INTERGER: i128 = 9007199254740991; + // We're duplicating the Era struct from Pallas for two reasons: a) we need it // to be serializable and we don't want to impose serde dependency on Pallas and // b) we prefer not to add dependencies to Pallas outside of the sources that @@ -381,13 +386,48 @@ fn serialize_int_scalar(value: &i128, serializer: S) -> Result JSON_MAX_SAFE_INTERGER || *value < -JSON_MAX_SAFE_INTERGER { + return value.to_string().serialize(serializer); + } + + value.serialize(serializer) } fn deserialize_int_scalar<'de, D>(deserializer: D) -> Result where D: Deserializer<'de>, { - let value: String = Deserialize::deserialize(deserializer)?; - Ok(value.parse().map_err(DeError::custom)?) + deserializer.deserialize_any(IntScalarVisitor) +} + +#[derive(Debug)] +struct IntScalarVisitor; +impl<'de> Visitor<'de> for IntScalarVisitor { + type Value = i128; + + fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result { + dbg!(self); + formatter.write_str("expect to receive integer") + } + + fn visit_str(self, v: &str) -> Result + where + E: serde::de::Error, + { + Ok(v.parse().map_err(DeError::custom)?) + } + + fn visit_u64(self, v: u64) -> Result + where + E: serde::de::Error, + { + Ok(v as i128) + } + + fn visit_i64(self, v: i64) -> Result + where + E: serde::de::Error, + { + Ok(v as i128) + } }