Skip to content

Commit d99ead1

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

File tree

29 files changed

+6981
-33
lines changed

29 files changed

+6981
-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: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
mod de;
2+
// mod se;

0 commit comments

Comments
 (0)