Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 7 additions & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ rust-version = "1.88"
[dependencies]
simdutf8 = { version = "0.1.4", features = ["public_imp", "aarch64_neon"] }

value-trait = { version = "0.12" }
value-trait = { version = "0.12.1" }
beef = { version = "0.5", optional = true }
halfbrown = "0.4"
# ahash known key
Expand All @@ -25,6 +25,9 @@ ahash = { version = "0.8", optional = true }
serde = { version = "1", features = ["derive"], optional = true }
serde_json = { version = "1", optional = true }

# preserve insertion order
indexmap = { version = "2.0", optional = true }

# perf testing
alloc_counter = { version = "0.0.4", optional = true }
colored = { version = "3.0", optional = true }
Expand Down Expand Up @@ -62,6 +65,9 @@ default = ["swar-number-parsing", "serde_impl", "runtime-detection"]

arraybackend = ["halfbrown/arraybackend"]

# preserve insertion order
preserve_order = ["dep:indexmap", "value-trait/indexmap"]

# Forces the `owned::Value` and `borrowed::Value` to deduplicate duplicated keys by letting consecutive keys overwrite previous ones. This comes at a
# performance cost. By default duplicate keys will not be overwritten and feeding json objects with duplicated
# keys to either of the `Value`s will result in undefined behavior.
Expand Down
14 changes: 14 additions & 0 deletions src/serde/value.rs
Original file line number Diff line number Diff line change
Expand Up @@ -9,3 +9,17 @@ pub use self::owned::from_value as from_owned_value;

pub use self::borrowed::to_value as to_borrowed_value;
pub use self::owned::to_value as to_owned_value;

#[cfg(feature = "preserve_order")]
pub use self::borrowed::ordered::from_refvalue as from_refborrowed_ordered_value;
#[cfg(feature = "preserve_order")]
pub use self::borrowed::ordered::from_value as from_borrowed_ordered_value;
#[cfg(feature = "preserve_order")]
pub use self::owned::ordered::from_refvalue as from_refowned_ordered_value;
#[cfg(feature = "preserve_order")]
pub use self::owned::ordered::from_value as from_owned_ordered_value;

#[cfg(feature = "preserve_order")]
pub use self::borrowed::ordered::to_value as to_borrowed_ordered_value;
#[cfg(feature = "preserve_order")]
pub use self::owned::ordered::to_value as to_owned_ordered_value;
2 changes: 2 additions & 0 deletions src/serde/value/borrowed.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
mod de;
mod se;
#[cfg(feature = "preserve_order")]
pub mod ordered;

use crate::{BorrowedValue, Result};
use serde_ext::de::Deserialize;
Expand Down
1 change: 1 addition & 0 deletions src/serde/value/borrowed/de.rs
Original file line number Diff line number Diff line change
Expand Up @@ -220,6 +220,7 @@ struct ObjectRefAccess<'de> {
i: halfbrown::Iter<'de, Cow<'de, str>, Value<'de>>,
v: Option<&'de Value<'de>>,
}

impl<'de> ObjectRefAccess<'de> {
fn new(i: halfbrown::Iter<'de, Cow<'de, str>, Value<'de>>) -> Self {
Self { i, v: None }
Expand Down
46 changes: 46 additions & 0 deletions src/serde/value/borrowed/ordered.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
mod de;
mod se;

use crate::value::borrowed::ordered::Value;
use crate::Result;
use serde_ext::de::Deserialize;
use serde_ext::ser::Serialize;

/// Tries to convert a struct that implements serde's serialize into
/// an ordered `BorrowedValue`
///
/// # Errors
///
/// Will return `Err` if value fails to be turned into a borrowed ordered value
pub fn to_value<'se, T>(value: T) -> Result<Value<'se>>
where
T: Serialize,
{
value.serialize(se::Serializer::default())
}

/// Tries to convert a `BorrowedValue` into a struct that implements
/// serde's Deserialize interface
///
/// # Errors
///
/// Will return `Err` if `value` can not be deserialized
pub fn from_value<'de, T>(value: Value<'de>) -> Result<T>
where
T: Deserialize<'de>,
{
T::deserialize(value)
}

/// Tries to convert a `&BorrowedValue` into a struct that implements
/// serde's Deserialize interface
///
/// # Errors
///
/// Will return `Err` if `value` fails to be deserialized
pub fn from_refvalue<'de, T>(value: &'de Value<'de>) -> Result<T>
where
T: Deserialize<'de>,
{
T::deserialize(value)
}
Loading