diff --git a/Cargo.lock b/Cargo.lock index 09ae37b..c1baa4e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -285,7 +285,7 @@ checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" [[package]] name = "serac" -version = "0.4.2" +version = "0.4.3" dependencies = [ "cortex-m", "cortex-m-rt", diff --git a/serac/Cargo.toml b/serac/Cargo.toml index 122c31c..6439d7c 100644 --- a/serac/Cargo.toml +++ b/serac/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "serac" -version = "0.4.2" +version = "0.4.3" edition = "2024" description = "A static, modular, and light-weight serialization framework." license = "CC-BY-NC-SA-4.0" diff --git a/serac/src/encoding/vanilla.rs b/serac/src/encoding/vanilla.rs index c01f295..27bf571 100644 --- a/serac/src/encoding/vanilla.rs +++ b/serac/src/encoding/vanilla.rs @@ -227,6 +227,46 @@ impl_tuple!((A, a), (B, b), (C, c), (D, d), (E, e)); impl_tuple!((A, a), (B, b), (C, c), (D, d), (E, e), (F, f)); impl_tuple!((A, a), (B, b), (C, c), (D, d), (E, e), (F, f), (G, g)); +impl SerializeIter for Option { + fn serialize_iter<'a>( + &self, + dst: impl IntoIterator::Word>, + ) -> Result + where + ::Word: 'a, + { + let mut dst = dst.into_iter(); + + match self { + Some(t) => { + true.serialize_iter(&mut dst)?; + t.serialize_iter(&mut dst) + } + None => false.serialize_iter(&mut dst), + } + } + + fn deserialize_iter<'a>( + src: impl IntoIterator::Word>, + ) -> Result + where + ::Word: 'a, + { + let mut src = src.into_iter(); + + let discriminant = bool::deserialize_iter(&mut src)?; + + Ok(match discriminant { + true => Some(T::deserialize_iter(&mut src)?), + false => None, + }) + } +} + +unsafe impl Size for Option { + const SIZE: usize = 1 + T::SIZE; +} + // PhantomData impl (no-op) impl SerializeIter for PhantomData {