Add support for 128bit numbers serde (#871)

* Add support for 128bit numbers serde

* Add comment for future plans on large integer serialization
This commit is contained in:
Mohammad Amin Khashkhashi Moghaddam 2023-06-12 12:18:09 +02:00 committed by GitHub
parent 7dea578416
commit e9aae684b1
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 41 additions and 2 deletions

View File

@ -180,6 +180,18 @@ where
visitor.visit_i64(value)
}
fn deserialize_i128<V>(self, visitor: V) -> Result<V::Value, Self::Error>
where
V: serde::de::Visitor<'de>,
{
let value = self
.cursor
.read_i128::<B>()
.map_err(DeserializerError::from)?;
visitor.visit_i128(value)
}
fn deserialize_u8<V>(self, visitor: V) -> Result<V::Value, Self::Error>
where
V: serde::de::Visitor<'de>,
@ -224,6 +236,18 @@ where
visitor.visit_u64(value)
}
fn deserialize_u128<V>(self, visitor: V) -> Result<V::Value, Self::Error>
where
V: serde::de::Visitor<'de>,
{
let value = self
.cursor
.read_u128::<B>()
.map_err(DeserializerError::from)?;
visitor.visit_u128(value)
}
fn deserialize_f32<V>(self, _visitor: V) -> Result<V::Value, Self::Error>
where
V: serde::de::Visitor<'de>,

View File

@ -92,8 +92,9 @@
//! Integers:
//!
//! - `{u,i}8` are serialized as a single byte
//! - `{u,i}16/32/64` are serialized as bytes specified by the parser endianess type param.
//! - `{u,i}128` is not supported.
//! - `{u,i}16/32/64/128` are serialized as bytes specified by the parser endianess type param.
//! - Custom {U,I}128/256 wrappers may be implemented later (similar to Borsh) for better support
//! in JS, debugging, logging, etc.
//!
//! Floats:
//!
@ -272,6 +273,13 @@ impl<'a, W: Write, B: ByteOrder> serde::Serializer for &'a mut Serializer<W, B>
self.writer.write_i64::<B>(v).map_err(SerializerError::from)
}
#[inline]
fn serialize_i128(self, v: i128) -> Result<Self::Ok, Self::Error> {
self.writer
.write_i128::<B>(v)
.map_err(SerializerError::from)
}
#[inline]
fn serialize_u8(self, v: u8) -> Result<Self::Ok, Self::Error> {
self.writer.write_all(&[v]).map_err(SerializerError::from)
@ -292,6 +300,13 @@ impl<'a, W: Write, B: ByteOrder> serde::Serializer for &'a mut Serializer<W, B>
self.writer.write_u64::<B>(v).map_err(SerializerError::from)
}
#[inline]
fn serialize_u128(self, v: u128) -> Result<Self::Ok, Self::Error> {
self.writer
.write_u128::<B>(v)
.map_err(SerializerError::from)
}
#[inline]
fn serialize_f32(self, _: f32) -> Result<Self::Ok, Self::Error> {
Err(SerializerError::Unsupported)