Skip to content

Commit 30fe080

Browse files
authored
release 1.2.0 (#48)
* core: boxed raw value * core: more helper * feat: add Custom kind to error * release 1.2.0 * more tests
1 parent 01b3c1f commit 30fe080

File tree

8 files changed

+269
-26
lines changed

8 files changed

+269
-26
lines changed

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "cbor4ii"
3-
version = "1.1.1"
3+
version = "1.2.0"
44
authors = ["quininer <quininer@live.com>"]
55
description = "CBOR: Concise Binary Object Representation"
66
repository = "https://github.com/quininer/cbor4ii"

src/core.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,9 @@ use crate::alloc::{ vec::Vec, boxed::Box, string::String };
1313

1414
pub use raw_value::RawValue;
1515

16+
#[cfg(feature = "use_alloc")]
17+
pub use raw_value::boxed::BoxedRawValue;
18+
1619

1720
/// Major type
1821
pub mod major {

src/core/dec.rs

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ use crate::util::ScopeGuard;
66
pub use crate::core::error::DecodeError as Error;
77

88
#[cfg(feature = "use_alloc")]
9-
use crate::alloc::{ vec::Vec, string::String };
9+
use crate::alloc::{ boxed::Box, vec::Vec, string::String };
1010

1111

1212
/// Read trait
@@ -748,6 +748,18 @@ impl<'de, T: Decode<'de>> Decode<'de> for Option<T> {
748748
}
749749
}
750750

751+
impl<'de, T: Decode<'de>> Decode<'de> for types::Maybe<Option<T>> {
752+
#[inline]
753+
fn decode<R: Read<'de>>(reader: &mut R) -> Result<Self, Error<R::Error>> {
754+
let len = <types::Array<()>>::len(reader)?;
755+
match len {
756+
Some(0) => Ok(types::Maybe(None)),
757+
Some(1) => T::decode(reader).map(Some).map(types::Maybe),
758+
_ => Err(Error::require_length(&"maybe", len))
759+
}
760+
}
761+
}
762+
751763
impl<'de> Decode<'de> for types::F16 {
752764
#[inline]
753765
fn decode<R: Read<'de>>(reader: &mut R) -> Result<Self, Error<R::Error>> {
@@ -808,6 +820,21 @@ impl<'de> Decode<'de> for f64 {
808820
}
809821
}
810822

823+
impl<'de> Decode<'de> for types::Nothing {
824+
#[inline]
825+
fn decode<R: Read<'de>>(_reader: &mut R) -> Result<Self, Error<R::Error>> {
826+
Ok(types::Nothing)
827+
}
828+
}
829+
830+
#[cfg(feature = "use_alloc")]
831+
impl<'de, T: Decode<'de>> Decode<'de> for Box<T> {
832+
#[inline]
833+
fn decode<R: Read<'de>>(reader: &mut R) -> Result<Self, Error<R::Error>> {
834+
T::decode(reader).map(Box::new)
835+
}
836+
}
837+
811838
/// Ignore an arbitrary object
812839
pub struct IgnoredAny;
813840

src/core/enc.rs

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ use core::convert::TryFrom;
44
use crate::core::{ types, major, marker };
55
pub use crate::core::error::EncodeError as Error;
66

7+
#[cfg(feature = "use_alloc")]
8+
use crate::alloc::{ boxed::Box, vec::Vec, string::String };
79

810
/// Write trait
911
///
@@ -208,6 +210,14 @@ impl Encode for types::Bytes<&'_ [u8]> {
208210
}
209211
}
210212

213+
#[cfg(feature = "use_alloc")]
214+
impl Encode for String {
215+
#[inline]
216+
fn encode<W: Write>(&self, writer: &mut W) -> Result<(), Error<W::Error>> {
217+
self.as_str().encode(writer)
218+
}
219+
}
220+
211221
impl Encode for &'_ str {
212222
#[inline]
213223
fn encode<W: Write>(&self, writer: &mut W) -> Result<(), Error<W::Error>> {
@@ -328,6 +338,13 @@ impl Encode for types::Undefined {
328338
}
329339
}
330340

341+
impl<T: Encode> Encode for types::Maybe<&'_ Option<T>> {
342+
#[inline]
343+
fn encode<W: Write>(&self, writer: &mut W) -> Result<(), Error<W::Error>> {
344+
self.0.as_slice().encode(writer)
345+
}
346+
}
347+
331348
#[cfg(feature = "half-f16")]
332349
impl Encode for half::f16 {
333350
#[inline]
@@ -365,6 +382,29 @@ impl Encode for f64 {
365382
}
366383
}
367384

385+
impl Encode for types::Nothing {
386+
#[inline]
387+
fn encode<W: Write>(&self, _writer: &mut W) -> Result<(), Error<W::Error>> {
388+
Ok(())
389+
}
390+
}
391+
392+
#[cfg(feature = "use_alloc")]
393+
impl<T: Encode> Encode for Box<T> {
394+
#[inline]
395+
fn encode<W: Write>(&self, writer: &mut W) -> Result<(), Error<W::Error>> {
396+
<T as Encode>::encode(&**self, writer)
397+
}
398+
}
399+
400+
#[cfg(feature = "use_alloc")]
401+
impl<T: Encode> Encode for Vec<T> {
402+
#[inline]
403+
fn encode<W: Write>(&self, writer: &mut W) -> Result<(), Error<W::Error>> {
404+
self.as_slice().encode(writer)
405+
}
406+
}
407+
368408
// from https://www.rfc-editor.org/rfc/rfc8949.html#name-examples-of-encoded-cbor-da
369409
#[test]
370410
#[cfg(feature = "use_std")]

src/core/error.rs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,10 @@ pub enum DecodeError<E> {
6868
DepthOverflow {
6969
name: StaticStr
7070
},
71+
Custom {
72+
name: StaticStr,
73+
num: u32
74+
}
7175
}
7276

7377
impl Len {
@@ -195,5 +199,5 @@ fn test_error_type_size() {
195199
assert_eq!(core::mem::size_of::<DecodeError<()>>(), 16);
196200

197201
// a word type
198-
assert_eq!(core::mem::size_of::<DecodeError<&'static ()>>(), 16);
202+
assert_eq!(core::mem::size_of::<DecodeError<&'static u8>>(), 16);
199203
}

src/core/raw_value.rs

Lines changed: 127 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use core::marker::PhantomData;
22
use crate::core::{ enc, dec };
33

4-
4+
#[derive(PartialEq, Eq, Debug, Clone)]
55
pub struct RawValue<'de>(&'de [u8]);
66

77
struct RawValueReader<'r, 'de, R>
@@ -91,13 +91,63 @@ impl enc::Encode for RawValue<'_> {
9191
}
9292
}
9393

94+
impl<'de> RawValue<'de> {
95+
pub fn as_bytes(&self) -> &'de [u8] {
96+
self.0
97+
}
98+
}
99+
100+
#[cfg(feature = "use_alloc")]
101+
pub mod boxed {
102+
use crate::core::Value;
103+
use crate::core::utils::BufWriter;
104+
use crate::alloc::boxed::Box;
105+
use super::*;
106+
107+
#[derive(PartialEq, Eq, Debug, Clone)]
108+
pub struct BoxedRawValue(Box<[u8]>);
109+
110+
impl<'de> dec::Decode<'de> for BoxedRawValue {
111+
#[inline]
112+
fn decode<R: dec::Read<'de>>(reader: &mut R) -> Result<Self, dec::Error<R::Error>> {
113+
let value = RawValue::decode(reader)?;
114+
Ok(BoxedRawValue(Box::from(value.0)))
115+
}
116+
}
117+
118+
impl enc::Encode for BoxedRawValue {
119+
#[inline]
120+
fn encode<W: enc::Write>(&self, writer: &mut W) -> Result<(), enc::Error<W::Error>> {
121+
writer.push(&self.0).map_err(enc::Error::Write)
122+
}
123+
}
124+
125+
impl BoxedRawValue {
126+
pub fn as_bytes(&self) -> &[u8] {
127+
&self.0
128+
}
129+
130+
pub fn from_value(value: &Value)
131+
-> Result<BoxedRawValue, enc::Error<crate::alloc::collections::TryReserveError>>
132+
{
133+
use crate::alloc::vec::Vec;
134+
use crate::core::enc::Encode;
135+
136+
let mut writer = BufWriter::new(Vec::new());
137+
value.encode(&mut writer)?;
138+
Ok(BoxedRawValue(writer.into_inner().into_boxed_slice()))
139+
}
140+
}
141+
}
142+
94143
#[test]
95144
#[cfg(feature = "use_std")]
96145
fn test_raw_value() {
97146
use crate::core::enc::Encode;
98147
use crate::core::dec::Decode;
99148
use crate::core::utils::{ BufWriter, SliceReader };
100149
use crate::core::types;
150+
use boxed::BoxedRawValue;
101151

102152
let buf = {
103153
let mut buf = BufWriter::new(Vec::new());
@@ -111,37 +161,91 @@ fn test_raw_value() {
111161
buf
112162
};
113163

114-
let mut reader = SliceReader::new(buf.buffer());
115-
let map = <types::Map<Vec<(&str, RawValue<'_>)>>>::decode(&mut reader).unwrap();
164+
// raw value
165+
{
166+
let mut reader = SliceReader::new(buf.buffer());
167+
let map = <types::Map<Vec<(&str, RawValue<'_>)>>>::decode(&mut reader).unwrap();
116168

117-
assert_eq!(map.0.len(), 1);
118-
assert_eq!(map.0[0].0, "bar");
169+
assert_eq!(map.0.len(), 1);
170+
assert_eq!(map.0[0].0, "bar");
119171

120-
let bar_raw_value = &map.0[0].1;
172+
let bar_raw_value = &map.0[0].1;
173+
assert!(!bar_raw_value.as_bytes().is_empty());
121174

122-
let buf2 = {
123-
let mut buf = BufWriter::new(Vec::new());
175+
let buf2 = {
176+
let mut buf = BufWriter::new(Vec::new());
124177

125-
types::Map(&[
126-
("bar", bar_raw_value)
127-
][..]).encode(&mut buf).unwrap();
178+
types::Map(&[
179+
("bar", bar_raw_value)
180+
][..]).encode(&mut buf).unwrap();
128181

129-
buf
130-
};
182+
buf
183+
};
184+
185+
assert_eq!(buf.buffer(), buf2.buffer());
186+
187+
type Bar<'a> = types::Map<Vec<(&'a str, u32)>>;
188+
189+
let mut reader = SliceReader::new(buf2.buffer());
190+
let map2 = <types::Map<Vec<(&str, Bar)>>>::decode(&mut reader).unwrap();
191+
192+
assert_eq!(map2.0.len(), 1);
193+
assert_eq!(map2.0[0].0, "bar");
194+
195+
let bar = &map2.0[0].1;
131196

132-
assert_eq!(buf.buffer(), buf2.buffer());
197+
assert_eq!(bar.0.len(), 1);
198+
assert_eq!(bar.0[0].0, "value");
199+
assert_eq!(bar.0[0].1, 0x99);
200+
}
201+
202+
// boxed raw value
203+
{
204+
let mut reader = SliceReader::new(buf.buffer());
205+
let map = <types::Map<Vec<(&str, BoxedRawValue)>>>::decode(&mut reader).unwrap();
206+
207+
assert_eq!(map.0.len(), 1);
208+
assert_eq!(map.0[0].0, "bar");
209+
210+
let bar_raw_value = &map.0[0].1;
211+
assert!(!bar_raw_value.as_bytes().is_empty());
212+
213+
// check from value
214+
{
215+
use crate::core::Value;
216+
217+
let mut reader = SliceReader::new(buf.buffer());
218+
let map = <types::Map<Vec<(&str, Value)>>>::decode(&mut reader).unwrap();
219+
220+
let bar_value = &map.0[0].1;
221+
let bar_raw_value2 = BoxedRawValue::from_value(&bar_value).unwrap();
222+
assert_eq!(bar_raw_value, &bar_raw_value2);
223+
}
133224

134-
type Bar<'a> = types::Map<Vec<(&'a str, u32)>>;
225+
let buf2 = {
226+
let mut buf = BufWriter::new(Vec::new());
135227

136-
let mut reader = SliceReader::new(buf2.buffer());
137-
let map2 = <types::Map<Vec<(&str, Bar)>>>::decode(&mut reader).unwrap();
228+
types::Map(&[
229+
("bar", bar_raw_value)
230+
][..]).encode(&mut buf).unwrap();
231+
232+
buf
233+
};
138234

139-
assert_eq!(map2.0.len(), 1);
140-
assert_eq!(map2.0[0].0, "bar");
235+
assert_eq!(buf.buffer(), buf2.buffer());
141236

142-
let bar = &map2.0[0].1;
237+
type Bar<'a> = types::Map<Vec<(&'a str, u32)>>;
143238

144-
assert_eq!(bar.0.len(), 1);
145-
assert_eq!(bar.0[0].0, "value");
146-
assert_eq!(bar.0[0].1, 0x99);
239+
let mut reader = SliceReader::new(buf2.buffer());
240+
let map2 = <types::Map<Vec<(&str, Bar)>>>::decode(&mut reader).unwrap();
241+
242+
assert_eq!(map2.0.len(), 1);
243+
assert_eq!(map2.0[0].0, "bar");
244+
245+
let bar = &map2.0[0].1;
246+
247+
assert_eq!(bar.0.len(), 1);
248+
assert_eq!(bar.0[0].0, "value");
249+
assert_eq!(bar.0[0].1, 0x99);
250+
}
147251
}

src/core/types.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,3 +19,7 @@ pub struct Null;
1919
pub struct Undefined;
2020

2121
pub struct F16(pub u16);
22+
23+
pub struct Maybe<T>(pub T);
24+
25+
pub struct Nothing;

0 commit comments

Comments
 (0)