From ba1987655ffb330b823c6d13a7ab5c9675d5e67e Mon Sep 17 00:00:00 2001 From: kirk Date: Sun, 6 Aug 2023 14:41:36 +0000 Subject: [PATCH 1/2] add serialization of unit type --- src/serde_bin.rs | 14 ++++++++++++++ src/serde_ron.rs | 14 ++++++++++++++ tests/ser_de.rs | 2 ++ 3 files changed, 30 insertions(+) diff --git a/src/serde_bin.rs b/src/serde_bin.rs index 5dfd76e..556541b 100644 --- a/src/serde_bin.rs +++ b/src/serde_bin.rs @@ -410,6 +410,20 @@ where } } +impl SerBin for () { + #[inline(always)] + fn ser_bin(&self, _s: &mut Vec) { + // do nothing + } +} + +impl DeBin for () { + #[inline(always)] + fn de_bin(_o: &mut usize, _d: &[u8]) -> Result { + Ok(()) + } +} + impl SerBin for (A, B) where A: SerBin, diff --git a/src/serde_ron.rs b/src/serde_ron.rs index 867d88d..c768545 100644 --- a/src/serde_ron.rs +++ b/src/serde_ron.rs @@ -1062,6 +1062,20 @@ where t } +impl SerRon for () { + fn ser_ron(&self, _d: usize, s: &mut SerRonState) { + s.out.push_str("()"); + } +} + +impl DeRon for () { + fn de_ron(s: &mut DeRonState, i: &mut Chars) -> Result<(), DeRonErr> { + s.paren_open(i)?; + s.paren_close(i)?; + Ok(()) + } +} + impl SerRon for (A, B) where A: SerRon, diff --git a/tests/ser_de.rs b/tests/ser_de.rs index 860e3d4..34a9c09 100644 --- a/tests/ser_de.rs +++ b/tests/ser_de.rs @@ -12,6 +12,7 @@ fn ser_de() { d: Option, e: Option>, f: Option<([u32; 4], String)>, + g: (), } let mut map = HashMap::new(); @@ -24,6 +25,7 @@ fn ser_de() { d: None, e: Some(map), f: Some(([1, 2, 3, 4], "tuple".to_string())), + g: (), }; let bytes = SerBin::serialize_bin(&test); From 906c2b55c9e739d66b5eb3b2aabc37109f441786 Mon Sep 17 00:00:00 2001 From: kirk Date: Sun, 6 Aug 2023 14:50:53 +0000 Subject: [PATCH 2/2] update json unit type serde impl to output valid json --- src/serde_json.rs | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/serde_json.rs b/src/serde_json.rs index bdd7b2d..6bff6f3 100644 --- a/src/serde_json.rs +++ b/src/serde_json.rs @@ -748,15 +748,18 @@ where impl SerJson for () { fn ser_json(&self, _d: usize, s: &mut SerJsonState) { - s.out.push_str("") + s.out.push_str("null") } } impl DeJson for () { fn de_json(s: &mut DeJsonState, i: &mut Chars) -> Result<(), DeJsonErr> { - // skip "" - s.next_tok(i)?; - return Ok(()); + if let DeJsonTok::Null = s.tok { + s.next_tok(i)?; + return Ok(()); + } else { + return Err(s.err_token("null")); + } } }