Skip to content

Commit f3ca390

Browse files
committed
Add 128bit integer support
1 parent 3af5e13 commit f3ca390

File tree

3 files changed

+28
-18
lines changed

3 files changed

+28
-18
lines changed

rustler/src/serde/de.rs

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,8 @@ impl<'de, 'a: 'de> de::Deserializer<'de> for Deserializer<'a> {
6363
TermType::Integer => {
6464
try_parse_number!(self.term, u64, visitor, visit_u64);
6565
try_parse_number!(self.term, i64, visitor, visit_i64);
66+
try_parse_number!(self.term, u128, visitor, visit_u128);
67+
try_parse_number!(self.term, i128, visitor, visit_i128);
6668

6769
Err(Error::ExpectedNumber)
6870
}
@@ -166,6 +168,14 @@ impl<'de, 'a: 'de> de::Deserializer<'de> for Deserializer<'a> {
166168
visitor.visit_i64(util::parse_number(&self.term)?)
167169
}
168170

171+
#[inline]
172+
fn deserialize_i128<V>(self, visitor: V) -> Result<V::Value, Self::Error>
173+
where
174+
V: Visitor<'de>,
175+
{
176+
visitor.visit_i128(util::parse_number(&self.term)?)
177+
}
178+
169179
#[inline]
170180
fn deserialize_u8<V>(self, visitor: V) -> Result<V::Value, Self::Error>
171181
where
@@ -198,6 +208,14 @@ impl<'de, 'a: 'de> de::Deserializer<'de> for Deserializer<'a> {
198208
visitor.visit_u64(util::parse_number(&self.term)?)
199209
}
200210

211+
#[inline]
212+
fn deserialize_u128<V>(self, visitor: V) -> Result<V::Value, self::Error>
213+
where
214+
V: Visitor<'de>,
215+
{
216+
visitor.visit_u128(util::parse_number(&self.term)?)
217+
}
218+
201219
#[inline]
202220
fn deserialize_f32<V>(self, visitor: V) -> Result<V::Value, Self::Error>
203221
where

rustler/src/serde/ser.rs

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,7 @@ use std::io::Write;
33
use crate::serde::{atoms, error::Error, util};
44
use crate::wrapper::list::make_list;
55
use crate::{types::tuple, Encoder, Env, OwnedBinary, Term};
6-
use serde::{
7-
ser::{self, Serialize},
8-
serde_if_integer128,
9-
};
6+
use serde::ser::{self, Serialize};
107

118
#[inline]
129
/// Converts a native Rust type into a native Elixir term. See [conversion table](https://github.com/sunny-g/serde_rustler/tree/master/serde_rustler#conversion-table) for details about serialization behavior.
@@ -147,15 +144,12 @@ impl<'a> ser::Serializer for Serializer<'a> {
147144
Ok(res)
148145
}
149146

150-
// TODO: update rustler to support u128 and i128
151-
serde_if_integer128! {
152-
fn serialize_i128(self, _v: i128) -> Result<Self::Ok, Self::Error> {
153-
unimplemented!("awaiting rustler support for i128s")
154-
}
147+
fn serialize_i128(self, v: i128) -> Result<Self::Ok, Self::Error> {
148+
Ok(v.encode(self.env))
149+
}
155150

156-
fn serialize_u128(self, _v: u128) -> Result<Self::Ok, Self::Error> {
157-
unimplemented!("awaiting rustler support for u128s")
158-
}
151+
fn serialize_u128(self, v: u128) -> Result<Self::Ok, Self::Error> {
152+
Ok(v.encode(self.env))
159153
}
160154

161155
#[inline]

rustler_tests/test/serde_rustler_tests_test.exs

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -109,11 +109,10 @@ defmodule SerdeRustlerTests.NifTest do
109109
run_tests("i64 (max)", 9_223_372_036_854_775_807, ctx)
110110
end
111111

112-
@tag :skip
113112
test "i128", ctx do
114-
run_tests("i128 (min)", 0, ctx)
115-
run_tests("128 (0)", 0, ctx)
116-
run_tests("i128 (max)", 0, ctx)
113+
run_tests("i128 (min)", -170141183460469231731687303715884105728, ctx)
114+
run_tests("i128 (0)", 0, ctx)
115+
run_tests("i128 (max)", 170141183460469231731687303715884105727, ctx)
117116
end
118117

119118
test "u8", ctx do
@@ -136,10 +135,9 @@ defmodule SerdeRustlerTests.NifTest do
136135
run_tests("u64 (max)", 18_446_744_073_709_551_615, ctx)
137136
end
138137

139-
@tag :skip
140138
test "u128", ctx do
141139
run_tests("u128 (min)", 0, ctx)
142-
run_tests("u128 (max)", 0, ctx)
140+
run_tests("u128 (max)", 340282366920938463463374607431768211455, ctx)
143141
end
144142

145143
test "f32", ctx do

0 commit comments

Comments
 (0)