Skip to content

Commit 871e752

Browse files
authored
Merge pull request #485 from dtolnay/raw
Implement RawValue type (alternative)
2 parents b0e3a97 + a45b5c5 commit 871e752

File tree

11 files changed

+1206
-61
lines changed

11 files changed

+1206
-61
lines changed

Cargo.toml

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,12 @@ compiletest_rs = "0.3"
2626
serde_bytes = "0.10"
2727
serde_derive = "1.0"
2828

29+
[package.metadata.docs.rs]
30+
features = ["raw_value"]
31+
32+
[package.metadata.playground]
33+
features = ["raw_value"]
34+
2935

3036
### FEATURES #################################################################
3137

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

src/de.rs

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -946,6 +946,17 @@ impl<'de, R: Read<'de>> Deserializer<R> {
946946
}
947947
}
948948
}
949+
950+
#[cfg(feature = "raw_value")]
951+
fn deserialize_raw_value<V>(&mut self, visitor: V) -> Result<V::Value>
952+
where
953+
V: de::Visitor<'de>,
954+
{
955+
self.parse_whitespace()?;
956+
self.read.begin_raw_buffering();
957+
self.ignore_value()?;
958+
self.read.end_raw_buffering(visitor)
959+
}
949960
}
950961

951962
impl FromStr for Number {
@@ -1412,10 +1423,18 @@ impl<'de, 'a, R: Read<'de>> de::Deserializer<'de> for &'a mut Deserializer<R> {
14121423

14131424
/// Parses a newtype struct as the underlying value.
14141425
#[inline]
1415-
fn deserialize_newtype_struct<V>(self, _name: &str, visitor: V) -> Result<V::Value>
1426+
fn deserialize_newtype_struct<V>(self, name: &str, visitor: V) -> Result<V::Value>
14161427
where
14171428
V: de::Visitor<'de>,
14181429
{
1430+
#[cfg(feature = "raw_value")]
1431+
{
1432+
if name == ::raw::TOKEN {
1433+
return self.deserialize_raw_value(visitor);
1434+
}
1435+
}
1436+
1437+
let _ = name;
14191438
visitor.visit_newtype_struct(self)
14201439
}
14211440

src/lib.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -390,3 +390,6 @@ pub mod value;
390390
mod iter;
391391
mod number;
392392
mod read;
393+
394+
#[cfg(feature = "raw_value")]
395+
mod raw;

src/number.rs

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -26,12 +26,7 @@ use error::ErrorCode;
2626
#[cfg(feature = "arbitrary_precision")]
2727
/// Not public API. Should be pub(crate).
2828
#[doc(hidden)]
29-
pub const SERDE_STRUCT_FIELD_NAME: &'static str = "$__serde_private_number";
30-
31-
#[cfg(feature = "arbitrary_precision")]
32-
/// Not public API. Should be pub(crate).
33-
#[doc(hidden)]
34-
pub const SERDE_STRUCT_NAME: &'static str = "$__serde_private_Number";
29+
pub const TOKEN: &'static str = "$serde_json::private::Number";
3530

3631
/// Represents a JSON number, whether integer or floating point.
3732
#[derive(Clone, PartialEq)]
@@ -346,8 +341,8 @@ impl Serialize for Number {
346341
{
347342
use serde::ser::SerializeStruct;
348343

349-
let mut s = serializer.serialize_struct(SERDE_STRUCT_NAME, 1)?;
350-
s.serialize_field(SERDE_STRUCT_FIELD_NAME, &self.n)?;
344+
let mut s = serializer.serialize_struct(TOKEN, 1)?;
345+
s.serialize_field(TOKEN, &self.n)?;
351346
s.end()
352347
}
353348
}
@@ -426,7 +421,7 @@ impl<'de> de::Deserialize<'de> for NumberKey {
426421
where
427422
E: de::Error,
428423
{
429-
if s == SERDE_STRUCT_FIELD_NAME {
424+
if s == TOKEN {
430425
Ok(())
431426
} else {
432427
Err(de::Error::custom("expected field with custom name"))
@@ -638,7 +633,7 @@ impl<'de> Deserializer<'de> for NumberFieldDeserializer {
638633
where
639634
V: de::Visitor<'de>,
640635
{
641-
visitor.visit_borrowed_str(SERDE_STRUCT_FIELD_NAME)
636+
visitor.visit_borrowed_str(TOKEN)
642637
}
643638

644639
forward_to_deserialize_any! {

0 commit comments

Comments
 (0)