Skip to content

Commit 696b542

Browse files
committed
feat(preserve_order): integrate IndexMap support across Value types and deserializers
1 parent c18bb92 commit 696b542

File tree

29 files changed

+7015
-33
lines changed

29 files changed

+7015
-33
lines changed

Cargo.toml

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ rust-version = "1.88"
1414
[dependencies]
1515
simdutf8 = { version = "0.1.4", features = ["public_imp", "aarch64_neon"] }
1616

17-
value-trait = { version = "0.12" }
17+
value-trait = { version = "0.12.1" }
1818
beef = { version = "0.5", optional = true }
1919
halfbrown = "0.4"
2020
# ahash known key
@@ -25,6 +25,9 @@ ahash = { version = "0.8", optional = true }
2525
serde = { version = "1", features = ["derive"], optional = true }
2626
serde_json = { version = "1", optional = true }
2727

28+
# preserve insertion order
29+
indexmap = { version = "2.0", optional = true }
30+
2831
# perf testing
2932
alloc_counter = { version = "0.0.4", optional = true }
3033
colored = { version = "3.0", optional = true }
@@ -62,6 +65,9 @@ default = ["swar-number-parsing", "serde_impl", "runtime-detection"]
6265

6366
arraybackend = ["halfbrown/arraybackend"]
6467

68+
# preserve insertion order
69+
preserve_order = ["dep:indexmap", "value-trait/indexmap"]
70+
6571
# Forces the `owned::Value` and `borrowed::Value` to deduplicate duplicated keys by letting consecutive keys overwrite previous ones. This comes at a
6672
# performance cost. By default duplicate keys will not be overwritten and feeding json objects with duplicated
6773
# keys to either of the `Value`s will result in undefined behavior.

src/serde/value/borrowed.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
mod de;
22
mod se;
3+
#[cfg(feature = "preserve_order")]
4+
pub mod ordered;
35

46
use crate::{BorrowedValue, Result};
57
use serde_ext::de::Deserialize;

src/serde/value/borrowed/de.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -220,6 +220,7 @@ struct ObjectRefAccess<'de> {
220220
i: halfbrown::Iter<'de, Cow<'de, str>, Value<'de>>,
221221
v: Option<&'de Value<'de>>,
222222
}
223+
223224
impl<'de> ObjectRefAccess<'de> {
224225
fn new(i: halfbrown::Iter<'de, Cow<'de, str>, Value<'de>>) -> Self {
225226
Self { i, v: None }
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
mod de;
2+
mod se;
3+
4+
use crate::value::borrowed::ordered::Value;
5+
use crate::Result;
6+
use serde_ext::ser::Serialize;
7+
8+
/// Tries to convert a struct that implements serde's serialize into
9+
/// an ordered `BorrowedValue`
10+
///
11+
/// # Errors
12+
///
13+
/// Will return `Err` if value fails to be turned into a borrowed ordered value
14+
pub fn to_value<'se, T>(value: T) -> Result<Value<'se>>
15+
where
16+
T: Serialize,
17+
{
18+
value.serialize(se::Serializer::default())
19+
}

0 commit comments

Comments
 (0)