Skip to content

Commit e9aae68

Browse files
authored
Add support for 128bit numbers serde (#871)
* Add support for 128bit numbers serde * Add comment for future plans on large integer serialization
1 parent 7dea578 commit e9aae68

File tree

2 files changed

+41
-2
lines changed

2 files changed

+41
-2
lines changed

pythnet/pythnet_sdk/src/wire/de.rs

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -180,6 +180,18 @@ where
180180
visitor.visit_i64(value)
181181
}
182182

183+
fn deserialize_i128<V>(self, visitor: V) -> Result<V::Value, Self::Error>
184+
where
185+
V: serde::de::Visitor<'de>,
186+
{
187+
let value = self
188+
.cursor
189+
.read_i128::<B>()
190+
.map_err(DeserializerError::from)?;
191+
192+
visitor.visit_i128(value)
193+
}
194+
183195
fn deserialize_u8<V>(self, visitor: V) -> Result<V::Value, Self::Error>
184196
where
185197
V: serde::de::Visitor<'de>,
@@ -224,6 +236,18 @@ where
224236
visitor.visit_u64(value)
225237
}
226238

239+
fn deserialize_u128<V>(self, visitor: V) -> Result<V::Value, Self::Error>
240+
where
241+
V: serde::de::Visitor<'de>,
242+
{
243+
let value = self
244+
.cursor
245+
.read_u128::<B>()
246+
.map_err(DeserializerError::from)?;
247+
248+
visitor.visit_u128(value)
249+
}
250+
227251
fn deserialize_f32<V>(self, _visitor: V) -> Result<V::Value, Self::Error>
228252
where
229253
V: serde::de::Visitor<'de>,

pythnet/pythnet_sdk/src/wire/ser.rs

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -92,8 +92,9 @@
9292
//! Integers:
9393
//!
9494
//! - `{u,i}8` are serialized as a single byte
95-
//! - `{u,i}16/32/64` are serialized as bytes specified by the parser endianess type param.
96-
//! - `{u,i}128` is not supported.
95+
//! - `{u,i}16/32/64/128` are serialized as bytes specified by the parser endianess type param.
96+
//! - Custom {U,I}128/256 wrappers may be implemented later (similar to Borsh) for better support
97+
//! in JS, debugging, logging, etc.
9798
//!
9899
//! Floats:
99100
//!
@@ -272,6 +273,13 @@ impl<'a, W: Write, B: ByteOrder> serde::Serializer for &'a mut Serializer<W, B>
272273
self.writer.write_i64::<B>(v).map_err(SerializerError::from)
273274
}
274275

276+
#[inline]
277+
fn serialize_i128(self, v: i128) -> Result<Self::Ok, Self::Error> {
278+
self.writer
279+
.write_i128::<B>(v)
280+
.map_err(SerializerError::from)
281+
}
282+
275283
#[inline]
276284
fn serialize_u8(self, v: u8) -> Result<Self::Ok, Self::Error> {
277285
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>
292300
self.writer.write_u64::<B>(v).map_err(SerializerError::from)
293301
}
294302

303+
#[inline]
304+
fn serialize_u128(self, v: u128) -> Result<Self::Ok, Self::Error> {
305+
self.writer
306+
.write_u128::<B>(v)
307+
.map_err(SerializerError::from)
308+
}
309+
295310
#[inline]
296311
fn serialize_f32(self, _: f32) -> Result<Self::Ok, Self::Error> {
297312
Err(SerializerError::Unsupported)

0 commit comments

Comments
 (0)