Cfg gate everything having to do with RawValue

This commit is contained in:
David Tolnay 2018-09-16 20:28:42 -07:00
parent 7e373b6125
commit f96b59d6b3
No known key found for this signature in database
GPG Key ID: F9BA143B95FF6D82
9 changed files with 102 additions and 17 deletions

View File

@ -41,3 +41,6 @@ preserve_order = ["indexmap"]
# allows JSON numbers of arbitrary size/precision to be read into a Number and # allows JSON numbers of arbitrary size/precision to be read into a Number and
# written back to a JSON string without loss of precision. # written back to a JSON string without loss of precision.
arbitrary_precision = [] arbitrary_precision = []
# Provide a RawValue type that can hold unprocessed JSON during deserialization.
raw_value = []

View File

@ -947,6 +947,7 @@ impl<'de, R: Read<'de>> Deserializer<R> {
} }
} }
#[cfg(feature = "raw_value")]
fn deserialize_raw_value<V>(&mut self, visitor: V) -> Result<V::Value> fn deserialize_raw_value<V>(&mut self, visitor: V) -> Result<V::Value>
where where
V: de::Visitor<'de>, V: de::Visitor<'de>,
@ -1426,10 +1427,14 @@ impl<'de, 'a, R: Read<'de>> de::Deserializer<'de> for &'a mut Deserializer<R> {
where where
V: de::Visitor<'de>, V: de::Visitor<'de>,
{ {
if name == ::raw::SERDE_STRUCT_NAME { #[cfg(feature = "raw_value")]
return self.deserialize_raw_value(visitor); {
if name == ::raw::SERDE_STRUCT_NAME {
return self.deserialize_raw_value(visitor);
}
} }
let _ = name;
visitor.visit_newtype_struct(self) visitor.visit_newtype_struct(self)
} }

View File

@ -364,7 +364,11 @@ pub use self::ser::{
to_string, to_string_pretty, to_vec, to_vec_pretty, to_writer, to_writer_pretty, Serializer, to_string, to_string_pretty, to_vec, to_vec_pretty, to_writer, to_writer_pretty, Serializer,
}; };
#[doc(inline)] #[doc(inline)]
pub use self::value::{from_value, to_value, Map, Number, RawValue, Value}; pub use self::value::{from_value, to_value, Map, Number, Value};
#[cfg(feature = "raw_value")]
#[doc(inline)]
pub use self::value::RawValue;
// We only use our own error type; no need for From conversions provided by the // We only use our own error type; no need for From conversions provided by the
// standard library's try! macro. This reduces lines of LLVM IR by 4%. // standard library's try! macro. This reduces lines of LLVM IR by 4%.
@ -388,5 +392,7 @@ pub mod value;
mod iter; mod iter;
mod number; mod number;
mod raw;
mod read; mod read;
#[cfg(feature = "raw_value")]
mod raw;

View File

@ -9,11 +9,14 @@
use std::ops::Deref; use std::ops::Deref;
use std::{char, cmp, io, str}; use std::{char, cmp, io, str};
#[cfg(feature = "raw_value")]
use serde::de::Visitor; use serde::de::Visitor;
use iter::LineColIterator; use iter::LineColIterator;
use error::{Error, ErrorCode, Result}; use error::{Error, ErrorCode, Result};
#[cfg(feature = "raw_value")]
use raw::{BorrowedRawDeserializer, OwnedRawDeserializer}; use raw::{BorrowedRawDeserializer, OwnedRawDeserializer};
/// Trait used by the deserializer for iterating over input. This is manually /// Trait used by the deserializer for iterating over input. This is manually
@ -83,11 +86,13 @@ pub trait Read<'de>: private::Sealed {
/// Switch raw buffering mode on. /// Switch raw buffering mode on.
/// ///
/// This is used when deserializing `RawValue`. /// This is used when deserializing `RawValue`.
#[cfg(feature = "raw_value")]
#[doc(hidden)] #[doc(hidden)]
fn begin_raw_buffering(&mut self); fn begin_raw_buffering(&mut self);
/// Switch raw buffering mode off and provides the raw buffered data to the /// Switch raw buffering mode off and provides the raw buffered data to the
/// given visitor. /// given visitor.
#[cfg(feature = "raw_value")]
#[doc(hidden)] #[doc(hidden)]
fn end_raw_buffering<V>(&mut self, visitor: V) -> Result<V::Value> fn end_raw_buffering<V>(&mut self, visitor: V) -> Result<V::Value>
where where
@ -123,6 +128,7 @@ where
iter: LineColIterator<io::Bytes<R>>, iter: LineColIterator<io::Bytes<R>>,
/// Temporary storage of peeked byte. /// Temporary storage of peeked byte.
ch: Option<u8>, ch: Option<u8>,
#[cfg(feature = "raw_value")]
raw_buffer: Option<Vec<u8>>, raw_buffer: Option<Vec<u8>>,
} }
@ -134,6 +140,7 @@ pub struct SliceRead<'a> {
slice: &'a [u8], slice: &'a [u8],
/// Index of the *next* byte that will be returned by next() or peek(). /// Index of the *next* byte that will be returned by next() or peek().
index: usize, index: usize,
#[cfg(feature = "raw_value")]
raw_buffering_start_index: usize, raw_buffering_start_index: usize,
} }
@ -142,6 +149,7 @@ pub struct SliceRead<'a> {
// Able to elide UTF-8 checks by assuming that the input is valid UTF-8. // Able to elide UTF-8 checks by assuming that the input is valid UTF-8.
pub struct StrRead<'a> { pub struct StrRead<'a> {
delegate: SliceRead<'a>, delegate: SliceRead<'a>,
#[cfg(feature = "raw_value")]
data: &'a str, data: &'a str,
} }
@ -161,6 +169,7 @@ where
IoRead { IoRead {
iter: LineColIterator::new(reader.bytes()), iter: LineColIterator::new(reader.bytes()),
ch: None, ch: None,
#[cfg(feature = "raw_value")]
raw_buffer: None, raw_buffer: None,
} }
} }
@ -214,16 +223,22 @@ where
fn next(&mut self) -> io::Result<Option<u8>> { fn next(&mut self) -> io::Result<Option<u8>> {
match self.ch.take() { match self.ch.take() {
Some(ch) => { Some(ch) => {
if let Some(ref mut buf) = self.raw_buffer { #[cfg(feature = "raw_value")]
buf.push(ch); {
if let Some(ref mut buf) = self.raw_buffer {
buf.push(ch);
}
} }
Ok(Some(ch)) Ok(Some(ch))
} }
None => match self.iter.next() { None => match self.iter.next() {
Some(Err(err)) => Err(err), Some(Err(err)) => Err(err),
Some(Ok(ch)) => { Some(Ok(ch)) => {
if let Some(ref mut buf) = self.raw_buffer { #[cfg(feature = "raw_value")]
buf.push(ch); {
if let Some(ref mut buf) = self.raw_buffer {
buf.push(ch);
}
} }
Ok(Some(ch)) Ok(Some(ch))
} }
@ -247,7 +262,13 @@ where
} }
} }
#[cfg(not(feature = "raw_value"))]
#[inline] #[inline]
fn discard(&mut self) {
self.ch = None;
}
#[cfg(feature = "raw_value")]
fn discard(&mut self) { fn discard(&mut self) {
if let Some(ch) = self.ch.take() { if let Some(ch) = self.ch.take() {
if let Some(ref mut buf) = self.raw_buffer { if let Some(ref mut buf) = self.raw_buffer {
@ -309,10 +330,12 @@ where
} }
} }
#[cfg(feature = "raw_value")]
fn begin_raw_buffering(&mut self) { fn begin_raw_buffering(&mut self) {
self.raw_buffer = Some(Vec::new()); self.raw_buffer = Some(Vec::new());
} }
#[cfg(feature = "raw_value")]
fn end_raw_buffering<V>(&mut self, visitor: V) -> Result<V::Value> fn end_raw_buffering<V>(&mut self, visitor: V) -> Result<V::Value>
where where
V: Visitor<'de>, V: Visitor<'de>,
@ -331,6 +354,7 @@ impl<'a> SliceRead<'a> {
SliceRead { SliceRead {
slice: slice, slice: slice,
index: 0, index: 0,
#[cfg(feature = "raw_value")]
raw_buffering_start_index: 0, raw_buffering_start_index: 0,
} }
} }
@ -486,10 +510,12 @@ impl<'a> Read<'a> for SliceRead<'a> {
} }
} }
#[cfg(feature = "raw_value")]
fn begin_raw_buffering(&mut self) { fn begin_raw_buffering(&mut self) {
self.raw_buffering_start_index = self.index; self.raw_buffering_start_index = self.index;
} }
#[cfg(feature = "raw_value")]
fn end_raw_buffering<V>(&mut self, visitor: V) -> Result<V::Value> fn end_raw_buffering<V>(&mut self, visitor: V) -> Result<V::Value>
where where
V: Visitor<'a>, V: Visitor<'a>,
@ -507,6 +533,7 @@ impl<'a> StrRead<'a> {
pub fn new(s: &'a str) -> Self { pub fn new(s: &'a str) -> Self {
StrRead { StrRead {
delegate: SliceRead::new(s.as_bytes()), delegate: SliceRead::new(s.as_bytes()),
#[cfg(feature = "raw_value")]
data: s, data: s,
} }
} }
@ -561,10 +588,12 @@ impl<'a> Read<'a> for StrRead<'a> {
self.delegate.ignore_str() self.delegate.ignore_str()
} }
#[cfg(feature = "raw_value")]
fn begin_raw_buffering(&mut self) { fn begin_raw_buffering(&mut self) {
self.delegate.begin_raw_buffering() self.delegate.begin_raw_buffering()
} }
#[cfg(feature = "raw_value")]
fn end_raw_buffering<V>(&mut self, visitor: V) -> Result<V::Value> fn end_raw_buffering<V>(&mut self, visitor: V) -> Result<V::Value>
where where
V: Visitor<'a>, V: Visitor<'a>,

View File

@ -460,6 +460,7 @@ where
match name { match name {
#[cfg(feature = "arbitrary_precision")] #[cfg(feature = "arbitrary_precision")]
::number::SERDE_STRUCT_NAME => Ok(Compound::Number { ser: self }), ::number::SERDE_STRUCT_NAME => Ok(Compound::Number { ser: self }),
#[cfg(feature = "raw_value")]
::raw::SERDE_STRUCT_NAME => Ok(Compound::RawValue { ser: self }), ::raw::SERDE_STRUCT_NAME => Ok(Compound::RawValue { ser: self }),
_ => self.serialize_map(Some(len)), _ => self.serialize_map(Some(len)),
} }
@ -571,6 +572,7 @@ pub enum Compound<'a, W: 'a, F: 'a> {
}, },
#[cfg(feature = "arbitrary_precision")] #[cfg(feature = "arbitrary_precision")]
Number { ser: &'a mut Serializer<W, F> }, Number { ser: &'a mut Serializer<W, F> },
#[cfg(feature = "raw_value")]
RawValue { ser: &'a mut Serializer<W, F> }, RawValue { ser: &'a mut Serializer<W, F> },
} }
@ -608,6 +610,7 @@ where
} }
#[cfg(feature = "arbitrary_precision")] #[cfg(feature = "arbitrary_precision")]
Compound::Number { .. } => unreachable!(), Compound::Number { .. } => unreachable!(),
#[cfg(feature = "raw_value")]
Compound::RawValue { .. } => unreachable!(), Compound::RawValue { .. } => unreachable!(),
} }
} }
@ -624,6 +627,7 @@ where
} }
#[cfg(feature = "arbitrary_precision")] #[cfg(feature = "arbitrary_precision")]
Compound::Number { .. } => unreachable!(), Compound::Number { .. } => unreachable!(),
#[cfg(feature = "raw_value")]
Compound::RawValue { .. } => unreachable!(), Compound::RawValue { .. } => unreachable!(),
} }
} }
@ -707,6 +711,7 @@ where
} }
#[cfg(feature = "arbitrary_precision")] #[cfg(feature = "arbitrary_precision")]
Compound::Number { .. } => unreachable!(), Compound::Number { .. } => unreachable!(),
#[cfg(feature = "raw_value")]
Compound::RawValue { .. } => unreachable!(), Compound::RawValue { .. } => unreachable!(),
} }
} }
@ -748,6 +753,7 @@ where
} }
#[cfg(feature = "arbitrary_precision")] #[cfg(feature = "arbitrary_precision")]
Compound::Number { .. } => unreachable!(), Compound::Number { .. } => unreachable!(),
#[cfg(feature = "raw_value")]
Compound::RawValue { .. } => unreachable!(), Compound::RawValue { .. } => unreachable!(),
} }
} }
@ -774,6 +780,7 @@ where
} }
#[cfg(feature = "arbitrary_precision")] #[cfg(feature = "arbitrary_precision")]
Compound::Number { .. } => unreachable!(), Compound::Number { .. } => unreachable!(),
#[cfg(feature = "raw_value")]
Compound::RawValue { .. } => unreachable!(), Compound::RawValue { .. } => unreachable!(),
} }
} }
@ -790,6 +797,7 @@ where
} }
#[cfg(feature = "arbitrary_precision")] #[cfg(feature = "arbitrary_precision")]
Compound::Number { .. } => unreachable!(), Compound::Number { .. } => unreachable!(),
#[cfg(feature = "raw_value")]
Compound::RawValue { .. } => unreachable!(), Compound::RawValue { .. } => unreachable!(),
} }
} }
@ -822,6 +830,7 @@ where
Err(invalid_number()) Err(invalid_number())
} }
} }
#[cfg(feature = "raw_value")]
Compound::RawValue { ref mut ser, .. } => { Compound::RawValue { ref mut ser, .. } => {
if key == ::raw::SERDE_STRUCT_FIELD_NAME { if key == ::raw::SERDE_STRUCT_FIELD_NAME {
try!(value.serialize(RawValueStrEmitter(&mut *ser))); try!(value.serialize(RawValueStrEmitter(&mut *ser)));
@ -839,6 +848,7 @@ where
Compound::Map { .. } => ser::SerializeMap::end(self), Compound::Map { .. } => ser::SerializeMap::end(self),
#[cfg(feature = "arbitrary_precision")] #[cfg(feature = "arbitrary_precision")]
Compound::Number { .. } => Ok(()), Compound::Number { .. } => Ok(()),
#[cfg(feature = "raw_value")]
Compound::RawValue { .. } => Ok(()), Compound::RawValue { .. } => Ok(()),
} }
} }
@ -861,6 +871,7 @@ where
Compound::Map { .. } => ser::SerializeStruct::serialize_field(self, key, value), Compound::Map { .. } => ser::SerializeStruct::serialize_field(self, key, value),
#[cfg(feature = "arbitrary_precision")] #[cfg(feature = "arbitrary_precision")]
Compound::Number { .. } => unreachable!(), Compound::Number { .. } => unreachable!(),
#[cfg(feature = "raw_value")]
Compound::RawValue { .. } => unreachable!(), Compound::RawValue { .. } => unreachable!(),
} }
} }
@ -883,6 +894,7 @@ where
} }
#[cfg(feature = "arbitrary_precision")] #[cfg(feature = "arbitrary_precision")]
Compound::Number { .. } => unreachable!(), Compound::Number { .. } => unreachable!(),
#[cfg(feature = "raw_value")]
Compound::RawValue { .. } => unreachable!(), Compound::RawValue { .. } => unreachable!(),
} }
} }
@ -897,6 +909,7 @@ fn invalid_number() -> Error {
Error::syntax(ErrorCode::InvalidNumber, 0, 0) Error::syntax(ErrorCode::InvalidNumber, 0, 0)
} }
#[cfg(feature = "raw_value")]
fn invalid_raw_value() -> Error { fn invalid_raw_value() -> Error {
Error::syntax(ErrorCode::ExpectedSomeValue, 0, 0) Error::syntax(ErrorCode::ExpectedSomeValue, 0, 0)
} }
@ -1420,8 +1433,10 @@ impl<'a, W: io::Write, F: Formatter> ser::Serializer for NumberStrEmitter<'a, W,
} }
} }
#[cfg(feature = "raw_value")]
struct RawValueStrEmitter<'a, W: 'a + io::Write, F: 'a + Formatter>(&'a mut Serializer<W, F>); struct RawValueStrEmitter<'a, W: 'a + io::Write, F: 'a + Formatter>(&'a mut Serializer<W, F>);
#[cfg(feature = "raw_value")]
impl<'a, W: io::Write, F: Formatter> ser::Serializer for RawValueStrEmitter<'a, W, F> { impl<'a, W: io::Write, F: Formatter> ser::Serializer for RawValueStrEmitter<'a, W, F> {
type Ok = (); type Ok = ();
type Error = Error; type Error = Error;

View File

@ -118,6 +118,7 @@ impl<'de> Deserialize<'de> for Value {
let number: NumberFromString = visitor.next_value()?; let number: NumberFromString = visitor.next_value()?;
Ok(Value::Number(number.value)) Ok(Value::Number(number.value))
} }
#[cfg(feature = "raw_value")]
Some(KeyClass::RawValue) => { Some(KeyClass::RawValue) => {
let value = visitor.next_value_seed(::raw::RawValueFromString)?; let value = visitor.next_value_seed(::raw::RawValueFromString)?;
::from_str(value.as_ref()).map_err(de::Error::custom) ::from_str(value.as_ref()).map_err(de::Error::custom)
@ -310,12 +311,16 @@ impl<'de> serde::Deserializer<'de> for Value {
where where
V: Visitor<'de>, V: Visitor<'de>,
{ {
if name == ::raw::SERDE_STRUCT_NAME { #[cfg(feature = "raw_value")]
return visitor.visit_map(::raw::OwnedRawDeserializer { {
raw_value: Some(self.to_string()), if name == ::raw::SERDE_STRUCT_NAME {
}); return visitor.visit_map(::raw::OwnedRawDeserializer {
raw_value: Some(self.to_string()),
});
}
} }
let _ = name;
visitor.visit_newtype_struct(self) visitor.visit_newtype_struct(self)
} }
@ -845,12 +850,16 @@ impl<'de> serde::Deserializer<'de> for &'de Value {
where where
V: Visitor<'de>, V: Visitor<'de>,
{ {
if name == ::raw::SERDE_STRUCT_NAME { #[cfg(feature = "raw_value")]
return visitor.visit_map(::raw::OwnedRawDeserializer { {
raw_value: Some(self.to_string()), if name == ::raw::SERDE_STRUCT_NAME {
}); return visitor.visit_map(::raw::OwnedRawDeserializer {
raw_value: Some(self.to_string()),
});
}
} }
let _ = name;
visitor.visit_newtype_struct(self) visitor.visit_newtype_struct(self)
} }
@ -1308,6 +1317,7 @@ enum KeyClass {
Map(String), Map(String),
#[cfg(feature = "arbitrary_precision")] #[cfg(feature = "arbitrary_precision")]
Number, Number,
#[cfg(feature = "raw_value")]
RawValue, RawValue,
} }
@ -1336,6 +1346,7 @@ impl<'de> Visitor<'de> for KeyClassifier {
match s { match s {
#[cfg(feature = "arbitrary_precision")] #[cfg(feature = "arbitrary_precision")]
::number::SERDE_STRUCT_FIELD_NAME => Ok(KeyClass::Number), ::number::SERDE_STRUCT_FIELD_NAME => Ok(KeyClass::Number),
#[cfg(feature = "raw_value")]
::raw::SERDE_STRUCT_FIELD_NAME => Ok(KeyClass::RawValue), ::raw::SERDE_STRUCT_FIELD_NAME => Ok(KeyClass::RawValue),
_ => Ok(KeyClass::Map(s.to_owned())), _ => Ok(KeyClass::Map(s.to_owned())),
} }
@ -1348,6 +1359,7 @@ impl<'de> Visitor<'de> for KeyClassifier {
match s.as_str() { match s.as_str() {
#[cfg(feature = "arbitrary_precision")] #[cfg(feature = "arbitrary_precision")]
::number::SERDE_STRUCT_FIELD_NAME => Ok(KeyClass::Number), ::number::SERDE_STRUCT_FIELD_NAME => Ok(KeyClass::Number),
#[cfg(feature = "raw_value")]
::raw::SERDE_STRUCT_FIELD_NAME => Ok(KeyClass::RawValue), ::raw::SERDE_STRUCT_FIELD_NAME => Ok(KeyClass::RawValue),
_ => Ok(KeyClass::Map(s)), _ => Ok(KeyClass::Map(s)),
} }

View File

@ -118,6 +118,8 @@ use serde::ser::Serialize;
use error::Error; use error::Error;
pub use map::Map; pub use map::Map;
pub use number::Number; pub use number::Number;
#[cfg(feature = "raw_value")]
pub use raw::RawValue; pub use raw::RawValue;
pub use self::index::Index; pub use self::index::Index;

View File

@ -230,6 +230,7 @@ impl serde::Serializer for Serializer {
match name { match name {
#[cfg(feature = "arbitrary_precision")] #[cfg(feature = "arbitrary_precision")]
::number::SERDE_STRUCT_NAME => Ok(SerializeMap::Number { out_value: None }), ::number::SERDE_STRUCT_NAME => Ok(SerializeMap::Number { out_value: None }),
#[cfg(feature = "raw_value")]
::raw::SERDE_STRUCT_NAME => Ok(SerializeMap::RawValue { out_value: None }), ::raw::SERDE_STRUCT_NAME => Ok(SerializeMap::RawValue { out_value: None }),
_ => self.serialize_map(Some(len)), _ => self.serialize_map(Some(len)),
} }
@ -265,6 +266,7 @@ pub enum SerializeMap {
}, },
#[cfg(feature = "arbitrary_precision")] #[cfg(feature = "arbitrary_precision")]
Number { out_value: Option<Value> }, Number { out_value: Option<Value> },
#[cfg(feature = "raw_value")]
RawValue { out_value: Option<Value> }, RawValue { out_value: Option<Value> },
} }
@ -360,6 +362,7 @@ impl serde::ser::SerializeMap for SerializeMap {
} }
#[cfg(feature = "arbitrary_precision")] #[cfg(feature = "arbitrary_precision")]
SerializeMap::Number { .. } => unreachable!(), SerializeMap::Number { .. } => unreachable!(),
#[cfg(feature = "raw_value")]
SerializeMap::RawValue { .. } => unreachable!(), SerializeMap::RawValue { .. } => unreachable!(),
} }
} }
@ -382,6 +385,7 @@ impl serde::ser::SerializeMap for SerializeMap {
} }
#[cfg(feature = "arbitrary_precision")] #[cfg(feature = "arbitrary_precision")]
SerializeMap::Number { .. } => unreachable!(), SerializeMap::Number { .. } => unreachable!(),
#[cfg(feature = "raw_value")]
SerializeMap::RawValue { .. } => unreachable!(), SerializeMap::RawValue { .. } => unreachable!(),
} }
} }
@ -391,6 +395,7 @@ impl serde::ser::SerializeMap for SerializeMap {
SerializeMap::Map { map, .. } => Ok(Value::Object(map)), SerializeMap::Map { map, .. } => Ok(Value::Object(map)),
#[cfg(feature = "arbitrary_precision")] #[cfg(feature = "arbitrary_precision")]
SerializeMap::Number { .. } => unreachable!(), SerializeMap::Number { .. } => unreachable!(),
#[cfg(feature = "raw_value")]
SerializeMap::RawValue { .. } => unreachable!(), SerializeMap::RawValue { .. } => unreachable!(),
} }
} }
@ -601,6 +606,7 @@ impl serde::ser::SerializeStruct for SerializeMap {
Err(invalid_number()) Err(invalid_number())
} }
} }
#[cfg(feature = "raw_value")]
SerializeMap::RawValue { ref mut out_value } => { SerializeMap::RawValue { ref mut out_value } => {
if key == ::raw::SERDE_STRUCT_FIELD_NAME { if key == ::raw::SERDE_STRUCT_FIELD_NAME {
*out_value = Some(value.serialize(RawValueEmitter)?); *out_value = Some(value.serialize(RawValueEmitter)?);
@ -619,6 +625,7 @@ impl serde::ser::SerializeStruct for SerializeMap {
SerializeMap::Number { out_value, .. } => { SerializeMap::Number { out_value, .. } => {
Ok(out_value.expect("number value was not emitted")) Ok(out_value.expect("number value was not emitted"))
} }
#[cfg(feature = "raw_value")]
SerializeMap::RawValue { out_value, .. } => { SerializeMap::RawValue { out_value, .. } => {
Ok(out_value.expect("raw value was not emitted")) Ok(out_value.expect("raw value was not emitted"))
} }
@ -826,12 +833,15 @@ impl ser::Serializer for NumberValueEmitter {
} }
} }
#[cfg(feature = "raw_value")]
struct RawValueEmitter; struct RawValueEmitter;
#[cfg(feature = "raw_value")]
fn invalid_raw_value() -> Error { fn invalid_raw_value() -> Error {
Error::syntax(ErrorCode::ExpectedSomeValue, 0, 0) Error::syntax(ErrorCode::ExpectedSomeValue, 0, 0)
} }
#[cfg(feature = "raw_value")]
impl ser::Serializer for RawValueEmitter { impl ser::Serializer for RawValueEmitter {
type Ok = Value; type Ok = Value;
type Error = Error; type Error = Error;

View File

@ -44,7 +44,7 @@ use serde_bytes::{ByteBuf, Bytes};
use serde_json::{ use serde_json::{
from_reader, from_slice, from_str, from_value, to_string, to_string_pretty, to_value, to_vec, from_reader, from_slice, from_str, from_value, to_string, to_string_pretty, to_value, to_vec,
to_writer, Deserializer, Number, RawValue, Value, to_writer, Deserializer, Number, Value,
}; };
macro_rules! treemap { macro_rules! treemap {
@ -2040,8 +2040,11 @@ fn test_integer128() {
]); ]);
} }
#[cfg(feature = "raw_value")]
#[test] #[test]
fn test_raw_value() { fn test_raw_value() {
use serde_json::RawValue;
#[derive(Serialize, Deserialize)] #[derive(Serialize, Deserialize)]
struct Wrapper<'a> { struct Wrapper<'a> {
a: i8, a: i8,