Skip to content

Commit a7d67c7

Browse files
committed
Merge #340: serde: add stringify serializer over generic T:Display
a5f99ef serde: add stringify serializer over generic T:Display (Trevor Arjeski) Pull request description: - Added a crate serde module and re-exported external serde crate from within it - Added a `simplicity::serializers::stringify` module that contains a generic serializer over `T: Display`, which can be used with `#[serde(with = "simplicity::serializers::stringify")]` over a struct field - Added a unit test that uses string values from Value's `value_display` test Resolves #330 ACKs for top commit: apoelstra: ACK a5f99ef; successfully ran local tests Tree-SHA512: 79a9942e55a1ea01eb6d421adaa303e5477c2afa7039d4bf934d1f6e4faf7d317c21695c6e58032999414f7d5023d16efd816889b748cea77d90cf416ff452ea
2 parents 1bff085 + a5f99ef commit a7d67c7

File tree

6 files changed

+89
-1
lines changed

6 files changed

+89
-1
lines changed

Cargo-recent.lock

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -212,6 +212,12 @@ version = "0.1.1"
212212
source = "registry+https://github.com/rust-lang/crates.io-index"
213213
checksum = "3011d1213f159867b13cfd6ac92d2cd5f1345762c63be3554e84092d85a50bbd"
214214

215+
[[package]]
216+
name = "itoa"
217+
version = "1.0.17"
218+
source = "registry+https://github.com/rust-lang/crates.io-index"
219+
checksum = "92ecc6618181def0457392ccd0ee51198e065e016d1d527a7ac1b6dc7c1f09d2"
220+
215221
[[package]]
216222
name = "jobserver"
217223
version = "0.1.34"
@@ -451,6 +457,19 @@ dependencies = [
451457
"syn",
452458
]
453459

460+
[[package]]
461+
name = "serde_json"
462+
version = "1.0.149"
463+
source = "registry+https://github.com/rust-lang/crates.io-index"
464+
checksum = "83fc039473c5595ace860d8c4fafa220ff474b3fc6bfdb4293327f1a37e94d86"
465+
dependencies = [
466+
"itoa",
467+
"memchr",
468+
"serde",
469+
"serde_core",
470+
"zmij",
471+
]
472+
454473
[[package]]
455474
name = "shlex"
456475
version = "1.3.0"
@@ -503,6 +522,7 @@ dependencies = [
503522
"miniscript",
504523
"santiago",
505524
"serde",
525+
"serde_json",
506526
"simplicity-sys 0.6.1",
507527
]
508528

@@ -626,3 +646,9 @@ dependencies = [
626646
"quote",
627647
"syn",
628648
]
649+
650+
[[package]]
651+
name = "zmij"
652+
version = "1.0.21"
653+
source = "registry+https://github.com/rust-lang/crates.io-index"
654+
checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa"

Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ getrandom = { version = "0.2", features = ["js"] }
4040
simplicity-sys = { version = "0.6.1", path = "./simplicity-sys", features = [
4141
"test-utils",
4242
] }
43+
serde_json = "1.0.149"
4344

4445
[workspace]
4546
members = ["simpcli", "simplicity-sys", "fuzz"]

src/bit_encoding/encode.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -347,7 +347,7 @@ mod test {
347347
let mut w = BitWriter::from(&mut sink);
348348
encode_natural(n, &mut w).expect("encoding to vector");
349349
w.flush_all().expect("flushing");
350-
let m = BitIter::from(sink.into_iter())
350+
let m: usize = BitIter::from(sink.into_iter())
351351
.read_natural(None)
352352
.expect("decoding from vector");
353353
assert_eq!(n, m);

src/lib.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,8 @@ mod merkle;
9696
pub mod node;
9797
#[cfg(feature = "elements")]
9898
pub mod policy;
99+
#[cfg(feature = "serde")]
100+
pub mod serializers;
99101
pub mod types;
100102
mod value;
101103

src/serializers/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
pub mod stringify;

src/serializers/stringify.rs

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
/// This module provides a generic serializer that serializes any type T:
2+
/// Display as a string and can be used with `#[serde(with =
3+
/// "simplicity::serializers::stringify")` over a struct field that implements
4+
/// `std::fmt::Display`.
5+
///
6+
///```rust
7+
/// use simplicity::Value;
8+
///
9+
/// #[derive(serde::Serialize)]
10+
/// struct Foo {
11+
/// #[serde(with = "simplicity::serializers::stringify")]
12+
/// v: Value,
13+
/// }
14+
///
15+
/// assert_eq!(
16+
/// serde_json::to_value(&Foo { v: Value::u1(0) }).unwrap(),
17+
/// serde_json::json!( { "v": "0b0" } )
18+
/// );
19+
///```
20+
use std::fmt::Display;
21+
22+
use serde::Serializer;
23+
24+
pub fn serialize<T, S>(value: &T, serializer: S) -> Result<S::Ok, S::Error>
25+
where
26+
S: Serializer,
27+
T: Display,
28+
{
29+
serializer.serialize_str(&value.to_string())
30+
}
31+
32+
#[cfg(test)]
33+
mod tests {
34+
use crate::Value;
35+
use serde::Serialize;
36+
37+
#[test]
38+
fn can_stringify_value() {
39+
#[derive(Serialize)]
40+
struct Foo {
41+
#[serde(with = "crate::serializers::stringify")]
42+
v: Value,
43+
}
44+
45+
// values taken from Value's `value_display` test
46+
let value_string_pairs = [
47+
(Value::u1(0), "0b0"),
48+
(Value::u1(1), "0b1"),
49+
(Value::u4(6), "0x6"),
50+
];
51+
for (v, want) in value_string_pairs {
52+
assert_eq!(
53+
serde_json::to_value(&Foo { v }).unwrap(),
54+
serde_json::json!({ "v": want }),
55+
);
56+
}
57+
}
58+
}

0 commit comments

Comments
 (0)