use crate::prelude::*;
use serde::{Deserialize, Deserializer};
pub fn de_string_to_bool<'de, D>(deserializer: D) -> Result<bool, D::Error>
where
D: Deserializer<'de>
{
let buf = String::deserialize(deserializer)?;
if buf == "1" {
return Ok(true);
}
else {
return Ok(false);
}
}
pub fn de_string_to_numeric<'de, D, T>(deserializer: D) -> Result<T, D::Error>
where
D: Deserializer<'de>,
T: std::str::FromStr + serde::Deserialize<'de>,
<T as std::str::FromStr>::Err: std::fmt::Display {
let buf = String::deserialize(deserializer)?;
buf.parse::<T>().map_err(serde::de::Error::custom)
}
#[allow(non_snake_case)]
pub fn de_string_to_U256<'de, D>(deserializer: D) -> Result<U256, D::Error>
where
D: Deserializer<'de>
{
let buf = String::deserialize(deserializer)?;
U256::from_dec_str(&buf).map_err(serde::de::Error::custom)
}
pub fn de_constructor_arguments_string_to_vec_string<'de, D>(deserializer: D) -> Result<Vec<String>, D::Error>
where
D: Deserializer<'de>
{
let str_buf = String::deserialize(deserializer)?;
if str_buf.is_empty() {
return Ok(Vec::new());
}
if str_buf.len() < 64 {
return Err("Input string length cannot be less than 64 characters").map_err(serde::de::Error::custom);
}
let mut offset_i: usize = 0;
let mut res_vec: Vec<String> = Vec::new();
while offset_i + 64 <= str_buf.len() {
res_vec.push( (&str_buf[offset_i..offset_i+64]).to_owned() );
offset_i = offset_i + 64;
}
Ok(res_vec)
}