Skip to content

Commit 2f9cc1f

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

File tree

2 files changed

+162
-2
lines changed

2 files changed

+162
-2
lines changed

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: 40 additions & 2 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]
@@ -638,6 +638,8 @@ impl ser::Serializer for &mut MapKeySerializer {
638638
mod tests {
639639
use crate::ByteString;
640640

641+
use serde_derive::Serialize;
642+
641643
use super::*;
642644

643645
#[cfg(all(feature = "alloc", not(feature = "std")))]
@@ -785,7 +787,7 @@ mod tests {
785787
#[test]
786788
fn test_serialize_none() {
787789
let value: Option<i64> = None;
788-
assert_is_unsupported_type!(to_vec(&value));
790+
assert_eq!(to_vec(&value).unwrap(), String::from("").into_bytes());
789791
}
790792

791793
#[test]
@@ -794,6 +796,42 @@ mod tests {
794796
assert_eq!(to_vec(&value).unwrap(), String::from("i2e").into_bytes());
795797
}
796798

799+
#[test]
800+
fn test_serialize_none_struct() {
801+
#[derive(Debug, PartialEq, Serialize)]
802+
struct S {
803+
inner: i64,
804+
}
805+
806+
let value: Option<S> = None;
807+
assert_eq!(to_vec(&value).unwrap(), String::from("").into_bytes());
808+
}
809+
810+
#[test]
811+
fn test_serialize_none_struct_none() {
812+
#[derive(Debug, PartialEq, Serialize)]
813+
struct S {
814+
inner: Option<i64>,
815+
}
816+
817+
let value: Option<S> = None;
818+
assert_eq!(to_vec(&value).unwrap(), String::from("").into_bytes());
819+
}
820+
821+
#[test]
822+
fn test_serialize_some_struct_some() {
823+
#[derive(Debug, PartialEq, Serialize)]
824+
struct S {
825+
inner: Option<i64>,
826+
}
827+
828+
let value: Option<S> = Some(S { inner: Some(32) });
829+
assert_eq!(
830+
to_vec(&value).unwrap(),
831+
String::from("d5:inneri32ee").into_bytes()
832+
);
833+
}
834+
797835
#[test]
798836
fn test_serialize_unit_struct() {
799837
use serde::Serializer;

0 commit comments

Comments
 (0)