Skip to content

Commit

Permalink
fix: enabled value for convert to string or int
Browse files Browse the repository at this point in the history
  • Loading branch information
paulobressan committed Oct 6, 2023
1 parent 46d2ca7 commit 8fa6dd4
Showing 1 changed file with 44 additions and 4 deletions.
48 changes: 44 additions & 4 deletions src/model.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -381,13 +386,48 @@ fn serialize_int_scalar<S>(value: &i128, serializer: S) -> Result<S::Ok, S::Erro
where
S: Serializer,
{
value.to_string().serialize(serializer)
if *value > 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<i128, D::Error>
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<E>(self, v: &str) -> Result<Self::Value, E>
where
E: serde::de::Error,
{
Ok(v.parse().map_err(DeError::custom)?)
}

fn visit_u64<E>(self, v: u64) -> Result<Self::Value, E>
where
E: serde::de::Error,
{
Ok(v as i128)
}

fn visit_i64<E>(self, v: i64) -> Result<Self::Value, E>
where
E: serde::de::Error,
{
Ok(v as i128)
}
}

0 comments on commit 8fa6dd4

Please sign in to comment.