forked from extern/nushell
Serialize bigint/bigdecimal as i64/f64
This commit is contained in:
parent
0afda5c466
commit
2b88f1eed0
@ -59,6 +59,7 @@ fn load_plugin(path: &std::path::Path, context: &mut Context) -> Result<(), Shel
|
|||||||
let result = match reader.read_line(&mut input) {
|
let result = match reader.read_line(&mut input) {
|
||||||
Ok(count) => {
|
Ok(count) => {
|
||||||
trace!("processing response ({} bytes)", count);
|
trace!("processing response ({} bytes)", count);
|
||||||
|
trace!("response: {}", input);
|
||||||
|
|
||||||
let response = serde_json::from_str::<JsonRpc<Result<Signature, ShellError>>>(&input);
|
let response = serde_json::from_str::<JsonRpc<Result<Signature, ShellError>>>(&input);
|
||||||
match response {
|
match response {
|
||||||
|
@ -13,10 +13,64 @@ use std::fmt;
|
|||||||
use std::path::PathBuf;
|
use std::path::PathBuf;
|
||||||
use std::time::SystemTime;
|
use std::time::SystemTime;
|
||||||
|
|
||||||
|
mod serde_bigint {
|
||||||
|
use num_traits::cast::FromPrimitive;
|
||||||
|
use num_traits::cast::ToPrimitive;
|
||||||
|
|
||||||
|
pub fn serialize<S>(big_int: &super::BigInt, serializer: S) -> Result<S::Ok, S::Error>
|
||||||
|
where
|
||||||
|
S: serde::Serializer,
|
||||||
|
{
|
||||||
|
serde::Serialize::serialize(
|
||||||
|
&big_int
|
||||||
|
.to_i64()
|
||||||
|
.ok_or(serde::ser::Error::custom("expected a i64-sized bignum"))?,
|
||||||
|
serializer,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn deserialize<'de, D>(deserializer: D) -> Result<super::BigInt, D::Error>
|
||||||
|
where
|
||||||
|
D: serde::Deserializer<'de>,
|
||||||
|
{
|
||||||
|
let x: i64 = serde::Deserialize::deserialize(deserializer)?;
|
||||||
|
Ok(super::BigInt::from_i64(x)
|
||||||
|
.ok_or(serde::de::Error::custom("expected a i64-sized bignum"))?)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
mod serde_bigdecimal {
|
||||||
|
use num_traits::cast::FromPrimitive;
|
||||||
|
use num_traits::cast::ToPrimitive;
|
||||||
|
|
||||||
|
pub fn serialize<S>(big_decimal: &super::BigDecimal, serializer: S) -> Result<S::Ok, S::Error>
|
||||||
|
where
|
||||||
|
S: serde::Serializer,
|
||||||
|
{
|
||||||
|
serde::Serialize::serialize(
|
||||||
|
&big_decimal
|
||||||
|
.to_f64()
|
||||||
|
.ok_or(serde::ser::Error::custom("expected a f64-sized bignum"))?,
|
||||||
|
serializer,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn deserialize<'de, D>(deserializer: D) -> Result<super::BigDecimal, D::Error>
|
||||||
|
where
|
||||||
|
D: serde::Deserializer<'de>,
|
||||||
|
{
|
||||||
|
let x: f64 = serde::Deserialize::deserialize(deserializer)?;
|
||||||
|
Ok(super::BigDecimal::from_f64(x)
|
||||||
|
.ok_or(serde::de::Error::custom("expected a f64-sized bigdecimal"))?)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Debug, Clone, Ord, PartialOrd, Eq, PartialEq, Deserialize, Serialize)]
|
#[derive(Debug, Clone, Ord, PartialOrd, Eq, PartialEq, Deserialize, Serialize)]
|
||||||
pub enum Primitive {
|
pub enum Primitive {
|
||||||
Nothing,
|
Nothing,
|
||||||
|
#[serde(with = "serde_bigint")]
|
||||||
Int(BigInt),
|
Int(BigInt),
|
||||||
|
#[serde(with = "serde_bigdecimal")]
|
||||||
Decimal(BigDecimal),
|
Decimal(BigDecimal),
|
||||||
Bytes(u64),
|
Bytes(u64),
|
||||||
String(String),
|
String(String),
|
||||||
|
Loading…
Reference in New Issue
Block a user