Skip to content

Commit 54399b0

Browse files
authored
Merge pull request #36 from teymour-aldridge/serde_ron
Add optional support for `ron` serialization.
2 parents fc4aa2e + 061bd9d commit 54399b0

File tree

5 files changed

+70
-1
lines changed

5 files changed

+70
-1
lines changed

Diff for: fuzzcheck/Cargo.toml

+2-1
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ cc = "1.0.73"
1818
grammar_mutator = []
1919
regex_grammar = ["grammar_mutator", "regex-syntax"]
2020
serde_json_serializer = ["serde", "serde_json"]
21+
serde_ron_serializer = ["serde", "ron"]
2122

2223
default = ["grammar_mutator", "regex_grammar", "serde_json_serializer"]
2324

@@ -35,6 +36,7 @@ fuzzcheck_common = { path = "../fuzzcheck_common", version = "0.12.0" }
3536

3637
serde = { version = "1.0.139", features = ["derive"], optional = true }
3738
serde_json = { version = "1.0.82", optional = true }
39+
ron = { version = "0.7.1", optional = true }
3840

3941
fuzzcheck_mutators_derive = { path = "../fuzzcheck_mutators_derive", version = "0.12.0" }
4042

@@ -49,4 +51,3 @@ rustc-demangle = "0.1.21"
4951
[lib]
5052
name = "fuzzcheck"
5153
bench = false
52-

Diff for: fuzzcheck/src/builder.rs

+23
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,8 @@ use crate::sensors_and_pools::{
7474
AndPool, DifferentObservations, MaximiseEachCounterPool, MaximiseObservationPool, MostNDiversePool,
7575
SameObservations, SimplestToActivateCounterPool, WrapperSensor,
7676
};
77+
#[cfg(feature = "serde_ron_serializer")]
78+
use crate::SerdeRonSerializer;
7779
#[cfg(feature = "serde_json_serializer")]
7880
use crate::SerdeSerializer;
7981
use crate::{
@@ -427,6 +429,27 @@ where
427429
}
428430
}
429431
}
432+
433+
#[cfg(feature = "serde_ron_serializer")]
434+
impl<F, M, V> FuzzerBuilder2<F, M, V>
435+
where
436+
F: Fn(&V) -> bool,
437+
V: Clone + serde::Serialize + for<'e> serde::Deserialize<'e> + 'static,
438+
M: Mutator<V>,
439+
{
440+
/// Specify [`SerdeRonSerializer`] as the serializer to use when saving the
441+
/// interesting test cases to the file system.
442+
#[no_coverage]
443+
pub fn serde_ron_serializer(self) -> FuzzerBuilder3<F, M, V> {
444+
FuzzerBuilder3 {
445+
test_function: self.test_function,
446+
mutator: self.mutator,
447+
serializer: Box::new(SerdeRonSerializer::<V>::default()),
448+
_phantom: PhantomData,
449+
}
450+
}
451+
}
452+
430453
impl<F, M, V> FuzzerBuilder3<F, M, V>
431454
where
432455
F: Fn(&V) -> bool,

Diff for: fuzzcheck/src/lib.rs

+3
Original file line numberDiff line numberDiff line change
@@ -232,6 +232,9 @@ pub use sensors_and_pools::PoolExt;
232232
pub use sensors_and_pools::SensorExt;
233233
#[doc(inline)]
234234
pub use serializers::ByteSerializer;
235+
#[cfg(feature = "serde_ron_serializer")]
236+
#[doc(inline)]
237+
pub use serializers::SerdeRonSerializer;
235238
#[cfg(feature = "serde_json_serializer")]
236239
#[doc(inline)]
237240
pub use serializers::SerdeSerializer;

Diff for: fuzzcheck/src/serializers/mod.rs

+5
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,16 @@
1111
//! * [StringSerializer] encodes and decodes values of any type implementing
1212
//! `FromStr` and `ToString` into utf-8 encoded text files.
1313
14+
#[cfg(feature = "serde_ron_serializer")]
15+
mod serde_ron_serializer;
1416
#[cfg(feature = "serde_json_serializer")]
1517
mod serde_serializer;
18+
1619
use std::marker::PhantomData;
1720
use std::str::FromStr;
1821

22+
#[cfg(feature = "serde_ron_serializer")]
23+
pub use serde_ron_serializer::SerdeRonSerializer;
1924
#[cfg(feature = "serde_json_serializer")]
2025
pub use serde_serializer::SerdeSerializer;
2126

Diff for: fuzzcheck/src/serializers/serde_ron_serializer.rs

+37
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
use std::marker::PhantomData;
2+
3+
/// A serializer that uses [`serde`] and [`ron`] to serialize the test
4+
/// inputs (of arbitrary type `T: Serializable + for<'e> Deserializable<'e>`)
5+
/// to a "rusty object notation" file.
6+
#[doc(cfg(feature = "serde_ron_serializer"))]
7+
pub struct SerdeRonSerializer<S> {
8+
phantom: PhantomData<S>,
9+
}
10+
11+
impl<S> Default for SerdeRonSerializer<S> {
12+
#[no_coverage]
13+
fn default() -> Self {
14+
Self { phantom: PhantomData }
15+
}
16+
}
17+
18+
impl<S> crate::traits::Serializer for SerdeRonSerializer<S>
19+
where
20+
S: serde::Serialize + for<'e> serde::Deserialize<'e>,
21+
{
22+
type Value = S;
23+
24+
#[no_coverage]
25+
fn extension(&self) -> &str {
26+
"ron"
27+
}
28+
#[no_coverage]
29+
fn from_data(&self, data: &[u8]) -> Option<S> {
30+
let utf8_encoded = std::str::from_utf8(data).ok()?;
31+
ron::from_str(utf8_encoded).ok()
32+
}
33+
#[no_coverage]
34+
fn to_data(&self, value: &Self::Value) -> Vec<u8> {
35+
ron::to_string(value).unwrap().into_bytes()
36+
}
37+
}

0 commit comments

Comments
 (0)