Skip to content

Commit 4855097

Browse files
committed
feat: (de)serialize options
1 parent 50dfafc commit 4855097

2 files changed

Lines changed: 172 additions & 6 deletions

File tree

src/de.rs

Lines changed: 122 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -770,4 +770,126 @@ mod tests {
770770
assert_eq!(s, expected);
771771
Ok(())
772772
}
773+
774+
#[test]
775+
fn test_deserialize_some_struct() -> Result<()> {
776+
#[derive(Debug, PartialEq, Deserialize)]
777+
struct S {
778+
inner: i32,
779+
}
780+
781+
let input = "d5:inneri32ee";
782+
let s: Option<S> = from_slice(input.as_bytes())?;
783+
let expected = Some(S { inner: 32 });
784+
assert_eq!(s, expected);
785+
Ok(())
786+
}
787+
788+
#[test]
789+
fn test_deserialize_none_struct() -> Result<()> {
790+
#[derive(Debug, PartialEq, Deserialize)]
791+
struct S {
792+
inner: i32,
793+
}
794+
795+
let input = "de";
796+
// let s: Option<S> = from_slice(input.as_bytes());
797+
let s: Result<Option<S>> = from_slice(input.as_bytes());
798+
println!("{:?}", s);
799+
let s = s.unwrap();
800+
let expected = None;
801+
assert_eq!(s, expected);
802+
Ok(())
803+
}
804+
805+
#[test]
806+
fn test_deserialize_struct_some() -> Result<()> {
807+
#[derive(Debug, PartialEq, Deserialize)]
808+
struct S {
809+
inner: Option<i32>,
810+
}
811+
812+
let input = "d5:inneri32ee";
813+
let s: S = from_slice(input.as_bytes())?;
814+
let expected = S { inner: Some(32) };
815+
assert_eq!(s, expected);
816+
Ok(())
817+
}
818+
819+
#[test]
820+
fn test_deserialize_struct_none_dict() -> Result<()> {
821+
#[derive(Debug, PartialEq, Deserialize)]
822+
struct S {
823+
inner: Option<i32>,
824+
}
825+
826+
let input = "de";
827+
let s: S = from_slice(input.as_bytes())?;
828+
let expected = S { inner: None };
829+
assert_eq!(s, expected);
830+
Ok(())
831+
}
832+
833+
#[test]
834+
fn test_deserialize_struct_some_none() -> Result<()> {
835+
#[derive(Debug, PartialEq, Deserialize)]
836+
struct S {
837+
inner: Option<T>,
838+
}
839+
840+
#[derive(Debug, PartialEq, Deserialize)]
841+
struct T {
842+
innermost: Option<i32>,
843+
}
844+
845+
let input = "d5:innerdee";
846+
let s: S = from_slice(input.as_bytes())?;
847+
let expected = S {
848+
inner: Some(T { innermost: None }),
849+
};
850+
assert_eq!(s, expected);
851+
Ok(())
852+
}
853+
854+
#[test]
855+
fn test_deserialize_struct_some_some() -> Result<()> {
856+
#[derive(Debug, PartialEq, Deserialize)]
857+
struct S {
858+
inner: Option<T>,
859+
}
860+
861+
#[derive(Debug, PartialEq, Deserialize)]
862+
struct T {
863+
innermost: Option<i32>,
864+
}
865+
866+
let input = "d5:innerd9:innermosti32eee";
867+
let s: S = from_slice(input.as_bytes())?;
868+
let expected = S {
869+
inner: Some(T {
870+
innermost: Some(32),
871+
}),
872+
};
873+
assert_eq!(s, expected);
874+
Ok(())
875+
}
876+
877+
#[test]
878+
fn test_deserialize_inner_none() -> Result<()> {
879+
#[derive(Debug, PartialEq, Deserialize)]
880+
struct S {
881+
inner: Option<T>,
882+
}
883+
884+
#[derive(Debug, PartialEq, Deserialize)]
885+
struct T {
886+
innermost: Option<i32>,
887+
}
888+
889+
let input = "de";
890+
let s: S = from_slice(input.as_bytes())?;
891+
let expected = S { inner: None };
892+
assert_eq!(s, expected);
893+
Ok(())
894+
}
773895
}

src/ser.rs

Lines changed: 50 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -181,7 +181,7 @@ where
181181

182182
#[inline]
183183
fn serialize_none(self) -> Result<()> {
184-
self.serialize_unit()
184+
Ok(())
185185
}
186186

187187
#[inline]
@@ -266,8 +266,12 @@ where
266266
}
267267

268268
#[inline]
269-
fn serialize_map(self, _len: Option<usize>) -> Result<Self::SerializeMap> {
270-
self.writer.write_all(b"d")?;
269+
fn serialize_map(self, len: Option<usize>) -> Result<Self::SerializeMap> {
270+
assert!(len.is_some());
271+
println!("{:?}", len);
272+
if len.unwrap() > 0 {
273+
self.writer.write_all(b"d")?;
274+
}
271275
Ok(SerializeMap::new(self))
272276
}
273277

@@ -432,8 +436,10 @@ where
432436

433437
#[inline]
434438
fn end(mut self) -> Result<()> {
435-
self.end_map()?;
436-
self.ser.writer.write_all(b"e")?;
439+
if !self.entries.is_empty() {
440+
self.end_map()?;
441+
self.ser.writer.write_all(b"e")?;
442+
}
437443
Ok(())
438444
}
439445
}
@@ -638,6 +644,8 @@ impl ser::Serializer for &mut MapKeySerializer {
638644
mod tests {
639645
use crate::ByteString;
640646

647+
use serde_derive::Serialize;
648+
641649
use super::*;
642650

643651
#[cfg(all(feature = "alloc", not(feature = "std")))]
@@ -785,7 +793,7 @@ mod tests {
785793
#[test]
786794
fn test_serialize_none() {
787795
let value: Option<i64> = None;
788-
assert_is_unsupported_type!(to_vec(&value));
796+
assert_eq!(to_vec(&value).unwrap(), String::from("").into_bytes());
789797
}
790798

791799
#[test]
@@ -794,6 +802,42 @@ mod tests {
794802
assert_eq!(to_vec(&value).unwrap(), String::from("i2e").into_bytes());
795803
}
796804

805+
#[test]
806+
fn test_serialize_none_struct() {
807+
#[derive(Debug, PartialEq, Serialize)]
808+
struct S {
809+
inner: i64,
810+
}
811+
812+
let value: Option<S> = None;
813+
assert_eq!(to_vec(&value).unwrap(), String::from("").into_bytes());
814+
}
815+
816+
#[test]
817+
fn test_serialize_none_struct_none() {
818+
#[derive(Debug, PartialEq, Serialize)]
819+
struct S {
820+
inner: Option<i64>,
821+
}
822+
823+
let value: Option<S> = None;
824+
assert_eq!(to_vec(&value).unwrap(), String::from("").into_bytes());
825+
}
826+
827+
#[test]
828+
fn test_serialize_some_struct_some() {
829+
#[derive(Debug, PartialEq, Serialize)]
830+
struct S {
831+
inner: Option<i64>,
832+
}
833+
834+
let value: Option<S> = Some(S { inner: Some(32) });
835+
assert_eq!(
836+
to_vec(&value).unwrap(),
837+
String::from("d5inner:i32ee").into_bytes()
838+
);
839+
}
840+
797841
#[test]
798842
fn test_serialize_unit_struct() {
799843
use serde::Serializer;

0 commit comments

Comments
 (0)