From 342f7814ec2e79bed0344e5723b152ed7fc50e7c Mon Sep 17 00:00:00 2001 From: Murisi Tarusenga Date: Tue, 14 Oct 2025 12:24:18 +0200 Subject: [PATCH 1/2] Allow deserialize_seq to deserialize binaries. --- rustler/src/serde/de.rs | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/rustler/src/serde/de.rs b/rustler/src/serde/de.rs index 309a1999..17137882 100644 --- a/rustler/src/serde/de.rs +++ b/rustler/src/serde/de.rs @@ -1,6 +1,6 @@ use crate::serde::{atoms, error::Error, util}; use crate::{ - types::{ListIterator, MapIterator}, + types::{Encoder, ListIterator, MapIterator}, Term, TermType, }; use serde::{ @@ -325,12 +325,22 @@ impl<'de, 'a: 'de> de::Deserializer<'de> for Deserializer<'a> { where V: Visitor<'de>, { - if !(self.term.is_list() | self.term.is_empty_list()) { + if self.term.is_list() | self.term.is_empty_list() { + let iter: ListIterator = self.term.decode().or(Err(Error::ExpectedList))?; + visitor.visit_seq(SequenceDeserializer::new(iter)) + } else if self.term.is_binary() { + let binary = self + .term + .decode_as_binary() + .or(Err(Error::ExpectedBinary))?; + let iter = binary + .as_slice() + .iter() + .map(|x| x.encode(self.term.get_env())); + visitor.visit_seq(SequenceDeserializer::new(iter)) + } else { return Err(Error::ExpectedList); } - - let iter: ListIterator = self.term.decode().or(Err(Error::ExpectedList))?; - visitor.visit_seq(SequenceDeserializer::new(iter)) } #[inline] From 98abafc9681a5225528fd54747708dbbadc8b79f Mon Sep 17 00:00:00 2001 From: Murisi Tarusenga Date: Tue, 21 Oct 2025 05:26:49 +0200 Subject: [PATCH 2/2] Added a test case. --- rustler_tests/native/rustler_serde_test/src/test.rs | 1 + rustler_tests/test/serde_rustler_tests_test.exs | 10 ++++++++++ 2 files changed, 11 insertions(+) diff --git a/rustler_tests/native/rustler_serde_test/src/test.rs b/rustler_tests/native/rustler_serde_test/src/test.rs index beeec036..2494caae 100644 --- a/rustler_tests/native/rustler_serde_test/src/test.rs +++ b/rustler_tests/native/rustler_serde_test/src/test.rs @@ -113,6 +113,7 @@ pub fn test<'a>( // Sequences "sequences (empty)" => run_test!(Vec::new() as Vec), "sequences (primitive)" => run_test!(vec!["hello", "world"]), + "sequences (byte)" => run_test!(vec![2, 3, 5, 7, 11, 13]), "sequences (complex)" => { let a = NewtypeStruct(u8::min_value()); let b = NewtypeStruct(u8::max_value()); diff --git a/rustler_tests/test/serde_rustler_tests_test.exs b/rustler_tests/test/serde_rustler_tests_test.exs index 5bc5672a..6e550532 100644 --- a/rustler_tests/test/serde_rustler_tests_test.exs +++ b/rustler_tests/test/serde_rustler_tests_test.exs @@ -275,6 +275,16 @@ defmodule SerdeRustlerTests.NifTest do run_tests("sequences (primitive)", ["hello", "world"], ctx) end + test "sequences (byte)", ctx do + test_name = "sequences (byte)" + expected_term = <<2, 3, 5, 7, 11, 13>> + Helpers.run_de(test_name, expected_term) + + if ctx[:skip] != :transcode do + Helpers.run_transcode(test_name, expected_term) + end + end + test "sequences (complex)", ctx do test_case = [NewtypeStruct.record(num: 0), NewtypeStruct.record(num: 255)] transcoded = [[~s"#{NewtypeStruct}", 0], [~s"#{NewtypeStruct}", 255]]