Skip to content

Commit 16b27c3

Browse files
committed
add RawValue
1 parent 99c00e2 commit 16b27c3

File tree

8 files changed

+886
-82
lines changed

8 files changed

+886
-82
lines changed

Cargo.toml

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,8 @@ rust-version = "1.36.0"
2424
version = "0.8.2"
2525

2626
[dependencies]
27-
itoa = {version = "1.0.0", default-features = false }
28-
serde = {version = "1.0.100", default-features = false }
27+
itoa = { version = "1.0.0", default-features = false }
28+
serde = { version = "1.0.100", default-features = false }
2929

3030
[dev-dependencies]
3131
serde_derive = "1.0.100"
@@ -38,6 +38,8 @@ std = ["serde/std"]
3838

3939
alloc = ["serde/alloc"]
4040

41+
raw_value = []
42+
4143
[package.metadata.docs.rs]
4244
all-features = true
4345
rustdoc-args = ["--cfg", "docsrs"]

src/de.rs

Lines changed: 99 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -263,6 +263,63 @@ impl<'a> Deserializer<read::SliceRead<'a>> {
263263
}
264264
}
265265

266+
impl<'de, R: Read<'de>> Deserializer<R> {
267+
#[cfg(feature = "raw_value")]
268+
fn deserialize_raw_value<V>(&mut self, visitor: V) -> Result<V::Value>
269+
where
270+
V: de::Visitor<'de>,
271+
{
272+
self.read.begin_raw_buffering();
273+
self.ignore_value()?;
274+
self.read.end_raw_buffering(visitor)
275+
}
276+
277+
#[cfg(feature = "raw_value")]
278+
fn ignore_value(&mut self) -> Result<()> {
279+
match self.parse_peek()? {
280+
b'0'..=b'9' => {
281+
self.buf.clear();
282+
self.read.parse_byte_str(&mut self.buf)?;
283+
Ok(())
284+
}
285+
b'i' => {
286+
self.parse_next()?;
287+
self.parse_integer()?;
288+
Ok(())
289+
}
290+
b'l' => {
291+
self.parse_next()?;
292+
loop {
293+
if self.parse_peek()? == b'e' {
294+
self.parse_next()?;
295+
break;
296+
}
297+
self.ignore_value()?;
298+
}
299+
Ok(())
300+
}
301+
b'd' => {
302+
self.parse_next()?;
303+
loop {
304+
if self.parse_peek()? == b'e' {
305+
self.parse_next()?;
306+
break;
307+
}
308+
309+
self.buf.clear();
310+
self.read.parse_byte_str(&mut self.buf)?;
311+
self.ignore_value()?;
312+
}
313+
Ok(())
314+
}
315+
_ => Err(Error::new(
316+
ErrorKind::ExpectedSomeValue,
317+
self.read.byte_offset(),
318+
)),
319+
}
320+
}
321+
}
322+
266323
impl<'de, R: Read<'de>> de::Deserializer<'de> for &mut Deserializer<R> {
267324
type Error = Error;
268325

@@ -393,10 +450,16 @@ impl<'de, R: Read<'de>> de::Deserializer<'de> for &mut Deserializer<R> {
393450
}
394451

395452
#[inline]
396-
fn deserialize_newtype_struct<V>(self, _name: &'static str, visitor: V) -> Result<V::Value>
453+
fn deserialize_newtype_struct<V>(self, name: &'static str, visitor: V) -> Result<V::Value>
397454
where
398455
V: de::Visitor<'de>,
399456
{
457+
#[cfg(feature = "raw_value")]
458+
if name == crate::raw::TOKEN {
459+
return self.deserialize_raw_value(visitor);
460+
}
461+
462+
let _ = name;
400463
visitor.visit_newtype_struct(self)
401464
}
402465

@@ -481,10 +544,16 @@ where
481544
}
482545

483546
#[inline]
484-
fn deserialize_newtype_struct<V>(self, _name: &'static str, visitor: V) -> Result<V::Value>
547+
fn deserialize_newtype_struct<V>(self, name: &'static str, visitor: V) -> Result<V::Value>
485548
where
486549
V: de::Visitor<'de>,
487550
{
551+
#[cfg(feature = "raw_value")]
552+
if name == crate::raw::TOKEN {
553+
return self.de.deserialize_raw_value(visitor);
554+
}
555+
556+
let _ = name;
488557
visitor.visit_newtype_struct(self)
489558
}
490559

@@ -770,4 +839,32 @@ mod tests {
770839
assert_eq!(s, expected);
771840
Ok(())
772841
}
842+
843+
#[cfg(feature = "raw_value")]
844+
#[test]
845+
fn test_decode_raw_value_top_level() -> Result<()> {
846+
use crate::RawValue;
847+
848+
let input = b"li1ei2ei3ee";
849+
let raw: RawValue = from_slice(input)?;
850+
assert_eq!(raw.get(), input);
851+
Ok(())
852+
}
853+
854+
#[cfg(feature = "raw_value")]
855+
#[test]
856+
fn test_decode_raw_value_struct_field() -> Result<()> {
857+
use crate::RawValue;
858+
use serde_derive::Deserialize;
859+
860+
#[derive(Deserialize)]
861+
struct Envelope {
862+
payload: RawValue,
863+
}
864+
865+
let input = b"d7:payloadli1ei2eee";
866+
let decoded: Envelope = from_slice(input)?;
867+
assert_eq!(decoded.payload.get(), b"li1ei2ee");
868+
Ok(())
869+
}
773870
}

src/lib.rs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,9 +112,14 @@ mod error;
112112
pub mod read;
113113
pub mod write;
114114

115+
#[cfg(feature = "raw_value")]
116+
mod raw;
117+
115118
mod ser;
116119
pub mod value;
117120

121+
#[doc(inline)]
122+
pub use bipaddr::ByteIpAddr;
118123
#[doc(inline)]
119124
pub use bstring::ByteString;
120125
#[doc(inline)]
@@ -134,3 +139,7 @@ pub use ser::{to_vec, Serializer};
134139
#[doc(inline)]
135140
#[cfg(feature = "std")]
136141
pub use de::from_reader;
142+
143+
#[cfg(feature = "raw_value")]
144+
#[cfg_attr(docsrs, doc(cfg(feature = "raw_value")))]
145+
pub use raw::RawValue;

0 commit comments

Comments
 (0)