Skip to content

Commit c0542d7

Browse files
authored
Merge pull request #400 from Techcable/feature/sval2
Implement sval2 support
2 parents 1201c54 + f9582d1 commit c0542d7

File tree

6 files changed

+165
-3
lines changed

6 files changed

+165
-3
lines changed

.github/workflows/ci.yml

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@ jobs:
2727
features: rayon
2828
- rust: stable
2929
features: serde
30+
- rust: stable
31+
features: sval
3032
- rust: stable
3133
features: borsh
3234
- rust: stable
@@ -62,6 +64,10 @@ jobs:
6264
if: matrix.features == 'serde'
6365
run: |
6466
cargo test --verbose -p test-serde
67+
- name: Tests (sval)
68+
if: matrix.features == 'sval'
69+
run: |
70+
cargo test --verbose -p test-sval
6571
- name: Test run benchmarks
6672
if: matrix.bench != ''
6773
run: cargo test -v --benches
@@ -141,7 +147,7 @@ jobs:
141147
- name: Build (nightly)
142148
run: cargo +nightly build --verbose --all-features
143149
- name: Build (MSRV)
144-
run: cargo build --verbose --features arbitrary,quickcheck,serde,rayon
150+
run: cargo build --verbose --features arbitrary,quickcheck,serde,sval,rayon
145151

146152
# One job that "summarizes" the success state of this pipeline. This can then be added to branch
147153
# protection, rather than having to add each job separately.

Cargo.toml

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ arbitrary = { version = "1.0", optional = true, default-features = false }
2020
quickcheck = { version = "1.0", optional = true, default-features = false }
2121
serde = { version = "1.0", optional = true, default-features = false }
2222
rayon = { version = "1.9", optional = true }
23+
sval = { version = "2", optional = true, default-features = false }
2324

2425
# deprecated: use borsh's "indexmap" feature instead.
2526
borsh = { version = "1.2", optional = true, default-features = false }
@@ -51,11 +52,11 @@ sign-tag = true
5152
tag-name = "{{version}}"
5253

5354
[package.metadata.docs.rs]
54-
features = ["arbitrary", "quickcheck", "serde", "borsh", "rayon"]
55+
features = ["arbitrary", "quickcheck", "serde", "borsh", "rayon", "sval"]
5556
rustdoc-args = ["--cfg", "docsrs"]
5657

5758
[workspace]
58-
members = ["test-nostd", "test-serde"]
59+
members = ["test-nostd", "test-serde", "test-sval"]
5960

6061
[lints.clippy]
6162
style = "allow"

src/lib.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,8 @@ mod macros;
115115
mod borsh;
116116
#[cfg(feature = "serde")]
117117
mod serde;
118+
#[cfg(feature = "sval")]
119+
mod sval;
118120
mod util;
119121

120122
pub mod map;

src/sval.rs

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
#![cfg_attr(docsrs, doc(cfg(feature = "sval")))]
2+
3+
use crate::{IndexMap, IndexSet};
4+
use sval::{Stream, Value};
5+
6+
impl<K: Value, V: Value, S> Value for IndexMap<K, V, S> {
7+
fn stream<'sval, ST: Stream<'sval> + ?Sized>(&'sval self, stream: &mut ST) -> sval::Result {
8+
stream.map_begin(Some(self.len()))?;
9+
10+
for (k, v) in self {
11+
stream.map_key_begin()?;
12+
stream.value(k)?;
13+
stream.map_key_end()?;
14+
15+
stream.map_value_begin()?;
16+
stream.value(v)?;
17+
stream.map_value_end()?;
18+
}
19+
20+
stream.map_end()
21+
}
22+
}
23+
24+
impl<K: Value, S> Value for IndexSet<K, S> {
25+
fn stream<'sval, ST: Stream<'sval> + ?Sized>(&'sval self, stream: &mut ST) -> sval::Result {
26+
stream.seq_begin(Some(self.len()))?;
27+
28+
for value in self {
29+
stream.seq_value_begin()?;
30+
stream.value(value)?;
31+
stream.seq_value_end()?;
32+
}
33+
34+
stream.seq_end()
35+
}
36+
}

test-sval/Cargo.toml

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
[package]
2+
name = "test-sval"
3+
version = "0.1.0"
4+
publish = false
5+
edition = "2021"
6+
7+
[dependencies]
8+
9+
[dev-dependencies]
10+
fnv = "1.0"
11+
indexmap = { path = "..", features = ["sval"] }
12+
sval = { version = "2", features = ["derive"] }
13+
sval_test = "2"

test-sval/src/lib.rs

Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
#![cfg(test)]
2+
3+
use fnv::FnvBuildHasher;
4+
use indexmap::{indexmap, indexset, IndexMap, IndexSet};
5+
use sval_test::{assert_tokens, Token};
6+
7+
#[test]
8+
fn test_sval_map() {
9+
let map = indexmap! { 1 => 2, 3 => 4 };
10+
assert_tokens(
11+
&map,
12+
&[
13+
Token::MapBegin(Some(2)),
14+
Token::MapKeyBegin,
15+
Token::I32(1),
16+
Token::MapKeyEnd,
17+
Token::MapValueBegin,
18+
Token::I32(2),
19+
Token::MapValueEnd,
20+
Token::MapKeyBegin,
21+
Token::I32(3),
22+
Token::MapKeyEnd,
23+
Token::MapValueBegin,
24+
Token::I32(4),
25+
Token::MapValueEnd,
26+
Token::MapEnd,
27+
],
28+
);
29+
}
30+
31+
#[test]
32+
fn test_sval_set() {
33+
let set = indexset! { 1, 2, 3, 4 };
34+
assert_tokens(
35+
&set,
36+
&[
37+
Token::SeqBegin(Some(4)),
38+
Token::SeqValueBegin,
39+
Token::I32(1),
40+
Token::SeqValueEnd,
41+
Token::SeqValueBegin,
42+
Token::I32(2),
43+
Token::SeqValueEnd,
44+
Token::SeqValueBegin,
45+
Token::I32(3),
46+
Token::SeqValueEnd,
47+
Token::SeqValueBegin,
48+
Token::I32(4),
49+
Token::SeqValueEnd,
50+
Token::SeqEnd,
51+
],
52+
);
53+
}
54+
55+
#[test]
56+
fn test_sval_map_fnv_hasher() {
57+
let mut map: IndexMap<i32, i32, FnvBuildHasher> = Default::default();
58+
map.insert(1, 2);
59+
map.insert(3, 4);
60+
assert_tokens(
61+
&map,
62+
&[
63+
Token::MapBegin(Some(2)),
64+
Token::MapKeyBegin,
65+
Token::I32(1),
66+
Token::MapKeyEnd,
67+
Token::MapValueBegin,
68+
Token::I32(2),
69+
Token::MapValueEnd,
70+
Token::MapKeyBegin,
71+
Token::I32(3),
72+
Token::MapKeyEnd,
73+
Token::MapValueBegin,
74+
Token::I32(4),
75+
Token::MapValueEnd,
76+
Token::MapEnd,
77+
],
78+
);
79+
}
80+
81+
#[test]
82+
fn test_sval_set_fnv_hasher() {
83+
let mut set: IndexSet<i32, FnvBuildHasher> = Default::default();
84+
set.extend(1..5);
85+
assert_tokens(
86+
&set,
87+
&[
88+
Token::SeqBegin(Some(4)),
89+
Token::SeqValueBegin,
90+
Token::I32(1),
91+
Token::SeqValueEnd,
92+
Token::SeqValueBegin,
93+
Token::I32(2),
94+
Token::SeqValueEnd,
95+
Token::SeqValueBegin,
96+
Token::I32(3),
97+
Token::SeqValueEnd,
98+
Token::SeqValueBegin,
99+
Token::I32(4),
100+
Token::SeqValueEnd,
101+
Token::SeqEnd,
102+
],
103+
);
104+
}

0 commit comments

Comments
 (0)