diff --git a/src/serde_bin.rs b/src/serde_bin.rs index 249b94a..93a0f40 100644 --- a/src/serde_bin.rs +++ b/src/serde_bin.rs @@ -1,5 +1,5 @@ use core::error::Error; -use core::{convert::TryInto, time::Duration}; +use core::{convert::TryInto, ops::Range, time::Duration}; use alloc::borrow::ToOwned; use alloc::boxed::Box; @@ -274,6 +274,16 @@ impl DeBin for String { } } +impl SerBin for Range +where + T: SerBin, +{ + fn ser_bin(&self, s: &mut Vec) { + self.start.ser_bin(s); + self.end.ser_bin(s); + } +} + impl SerBin for Vec where T: SerBin, @@ -287,6 +297,17 @@ where } } +impl DeBin for Range +where + T: DeBin, +{ + fn de_bin(o: &mut usize, d: &[u8]) -> Result, DeBinErr> { + let start: T = DeBin::de_bin(o, d)?; + let end: T = DeBin::de_bin(o, d)?; + Ok(start..end) + } +} + impl DeBin for Vec where T: DeBin, diff --git a/src/serde_json.rs b/src/serde_json.rs index 4faaaea..8f0ca14 100644 --- a/src/serde_json.rs +++ b/src/serde_json.rs @@ -1,5 +1,5 @@ use core::str::Chars; -use core::{error::Error, time::Duration}; +use core::{error::Error, ops::Range, time::Duration}; use alloc::boxed::Box; use alloc::collections::{BTreeMap, BTreeSet, LinkedList}; @@ -871,6 +871,19 @@ impl DeJson for String { } } +impl SerJson for Range +where + T: SerJson, +{ + fn ser_json(&self, d: usize, s: &mut SerJsonState) { + s.out.push('['); + self.start.ser_json(d, s); + s.out.push(','); + self.end.ser_json(d, s); + s.out.push(']'); + } +} + impl SerJson for Vec where T: SerJson, @@ -891,6 +904,16 @@ where } } +impl DeJson for Range +where + T: DeJson, +{ + fn de_json(s: &mut DeJsonState, i: &mut Chars) -> Result { + let (start, end) = <(T, T)>::de_json(s, i)?; + Ok(start..end) + } +} + impl DeJson for Vec where T: DeJson, diff --git a/src/serde_ron.rs b/src/serde_ron.rs index d04df66..80beec1 100644 --- a/src/serde_ron.rs +++ b/src/serde_ron.rs @@ -1,5 +1,5 @@ use core::str::Chars; -use core::{error::Error, time::Duration}; +use core::{error::Error, ops::Range, time::Duration}; use alloc::boxed::Box; use alloc::collections::{BTreeMap, BTreeSet, LinkedList}; @@ -865,6 +865,19 @@ impl DeRon for String { } } +impl SerRon for Range +where + T: SerRon, +{ + fn ser_ron(&self, d: usize, s: &mut SerRonState) { + s.out.push('('); + self.start.ser_ron(d, s); + s.out.push(','); + self.end.ser_ron(d, s); + s.out.push(')'); + } +} + impl SerRon for Vec where T: SerRon, @@ -881,6 +894,16 @@ where } } +impl DeRon for Range +where + T: DeRon, +{ + fn de_ron(s: &mut DeRonState, i: &mut Chars) -> Result { + let (start, end) = <(T, T)>::de_ron(s, i)?; + Ok(start..end) + } +} + impl DeRon for Vec where T: DeRon, diff --git a/tests/bin.rs b/tests/bin.rs index a6ca33d..d75ebe0 100644 --- a/tests/bin.rs +++ b/tests/bin.rs @@ -2,7 +2,7 @@ extern crate alloc; -use std::{array, sync::atomic::AtomicBool}; +use std::{array, ops::Range, sync::atomic::AtomicBool}; use alloc::collections::{BTreeMap, BTreeSet, LinkedList}; @@ -256,6 +256,7 @@ fn collections() { pub b: LinkedList, pub c: BTreeMap, pub d: BTreeSet, + pub e: Range, } let test: Test = Test { @@ -263,6 +264,7 @@ fn collections() { b: vec![1.0, 2.0, 3.0, 4.0].into_iter().collect(), c: vec![(1, 2), (3, 4)].into_iter().collect(), d: vec![1, 2, 3, 4, 5, 6].into_iter().collect(), + e: 1..3, }; let bytes = SerBin::serialize_bin(&test); diff --git a/tests/json.rs b/tests/json.rs index b536604..80c4046 100644 --- a/tests/json.rs +++ b/tests/json.rs @@ -4,6 +4,7 @@ use nanoserde::{DeJson, DeJsonErrReason, SerJson}; use std::{ collections::{BTreeMap, BTreeSet, LinkedList}, fmt::Debug, + ops::Range, sync::atomic::AtomicBool, }; @@ -656,6 +657,7 @@ fn collections() { pub b: LinkedList, pub c: BTreeMap, pub d: BTreeSet, + pub e: Range, } let test: Test = Test { @@ -663,6 +665,7 @@ fn collections() { b: vec![1.0, 2.0, 3.0, 4.0].into_iter().collect(), c: vec![(1, 2), (3, 4)].into_iter().collect(), d: vec![1, 2, 3, 4, 5, 6].into_iter().collect(), + e: 1..3, }; let bytes = SerJson::serialize_json(&test); diff --git a/tests/ron.rs b/tests/ron.rs index a7b3ac3..5350d76 100644 --- a/tests/ron.rs +++ b/tests/ron.rs @@ -3,6 +3,7 @@ use nanoserde::{DeRon, DeRonErrReason, SerRon}; use std::{ collections::{BTreeMap, BTreeSet, LinkedList}, + ops::Range, sync::atomic::AtomicBool, }; @@ -277,6 +278,7 @@ fn collections() { pub b: LinkedList, pub c: BTreeMap, pub d: BTreeSet, + pub e: Range, } let test: Test = Test { @@ -284,6 +286,7 @@ fn collections() { b: vec![1.0, 2.0, 3.0, 4.0].into_iter().collect(), c: vec![(1, 2), (3, 4)].into_iter().collect(), d: vec![1, 2, 3, 4, 5, 6].into_iter().collect(), + e: 1..3, }; let bytes = SerRon::serialize_ron(&test);