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] 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]]