Skip to content

Commit 3172999

Browse files
authored
Merge pull request #57 from hashmismatch/serde_feature
Serde as an optional feature
2 parents 2e3d864 + af5ff97 commit 3172999

File tree

7 files changed

+55
-25
lines changed

7 files changed

+55
-25
lines changed

packed_struct/Cargo.toml

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,19 +12,16 @@ categories = ["encoding"]
1212
readme = "../README.md"
1313

1414
[dependencies]
15-
serde_derive = "1.0"
16-
17-
[dependencies.serde]
18-
version = "1.0"
19-
default-features = false
20-
15+
serde = { version = "1.0", optional = true, default-features = false }
16+
serde_derive = { version = "1.0", optional = true }
2117

2218
[features]
2319
default = ["std"]
2420
std = ["serde/std"]
2521
alloc = []
2622
byte_types_64 = []
2723
byte_types_256 = []
24+
use_serde = ["serde", "serde_derive"]
2825

2926
# comment this section when publishing new releases to crates.io!
3027
[dev-dependencies]

packed_struct/src/lib.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -287,7 +287,9 @@
287287
extern crate alloc;
288288

289289

290+
#[cfg(feature = "use_serde")]
290291
extern crate serde;
292+
#[cfg(feature = "use_serde")]
291293
#[macro_use] extern crate serde_derive;
292294

293295
mod internal_prelude;

packed_struct/src/packing.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,8 @@ pub trait PackedStructSlice where Self: Sized {
4141
}
4242
}
4343

44-
#[derive(Debug, Copy, Clone, PartialEq, Serialize)]
44+
#[cfg_attr(feature = "use_serde", derive(Serialize, Deserialize))]
45+
#[derive(Debug, Copy, Clone, PartialEq)]
4546
/// Packing errors that might occur during packing or unpacking
4647
pub enum PackingError {
4748
InvalidValue,

packed_struct/src/types_num.rs

Lines changed: 17 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -28,21 +28,25 @@ impl<T, B> Display for Integer<T, B> where T: Display {
2828
}
2929
}
3030

31-
use serde::ser::{Serialize, Serializer};
32-
impl<T, B> Serialize for Integer<T, B> where T: Serialize {
33-
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
34-
where S: Serializer
35-
{
36-
self.num.serialize(serializer)
31+
#[cfg(feature = "use_serde")]
32+
mod serialize {
33+
use serde::ser::{Serialize, Serializer};
34+
use serde::de::{Deserialize, Deserializer};
35+
36+
impl<T, B> Serialize for super::Integer<T, B> where T: Serialize {
37+
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
38+
where S: Serializer
39+
{
40+
self.num.serialize(serializer)
41+
}
3742
}
38-
}
3943

40-
use serde::de::{Deserialize, Deserializer};
41-
impl<'de, T, B> Deserialize<'de> for Integer<T, B> where T: Deserialize<'de>, T: Into<Integer<T, B>> {
42-
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
43-
where D: Deserializer<'de>
44-
{
45-
<T>::deserialize(deserializer).map(|n| n.into())
44+
impl<'de, T, B> Deserialize<'de> for super::Integer<T, B> where T: Deserialize<'de>, T: Into<super::Integer<T, B>> {
45+
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
46+
where D: Deserializer<'de>
47+
{
48+
<T>::deserialize(deserializer).map(|n| n.into())
49+
}
4650
}
4751
}
4852

packed_struct/src/types_reserved.rs

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,15 +14,17 @@ pub trait ReservedBitValue {
1414
fn get_reserved_bit_value_byte() -> u8;
1515
}
1616

17-
#[derive(Default, Copy, Clone, Debug, PartialEq, Serialize, Deserialize)]
17+
#[cfg_attr(feature = "use_serde", derive(Serialize, Deserialize))]
18+
#[derive(Default, Copy, Clone, PartialEq)]
1819
pub struct BitOne;
1920
impl ReservedBitValue for BitOne {
2021
fn get_reserved_bit_value_byte() -> u8 {
2122
0xFF
2223
}
2324
}
2425

25-
#[derive(Default, Copy, Clone, Debug, PartialEq, Serialize, Deserialize)]
26+
#[cfg_attr(feature = "use_serde", derive(Serialize, Deserialize))]
27+
#[derive(Default, Copy, Clone, PartialEq)]
2628
pub struct BitZero;
2729
impl ReservedBitValue for BitZero {
2830
fn get_reserved_bit_value_byte() -> u8 {
@@ -31,7 +33,8 @@ impl ReservedBitValue for BitZero {
3133
}
3234

3335
/// Always packs into the associated bit value. Ignores the input when unpacking.
34-
#[derive(Default, Copy, Clone, PartialEq, Serialize, Deserialize)]
36+
#[cfg_attr(feature = "use_serde", derive(Serialize, Deserialize))]
37+
#[derive(Default, Copy, Clone, PartialEq)]
3538
pub struct ReservedBits<V, B> {
3639
value: V,
3740
bits: PhantomData<B>

packed_struct_tests/Cargo.toml

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ authors = ["Rudi Benkovic <[email protected]>"]
55
publish = false
66

77
[dependencies]
8-
packed_struct = { version = "0.4", features = ["byte_types_64"] }
8+
packed_struct = { version = "0.4", features = ["byte_types_64", "use_serde"] }
99
packed_struct_codegen = "0.4"
10-
error-chain = "0.12.0"
10+
error-chain = "0.12.0"
11+
serde = "1.0"
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
extern crate packed_struct;
2+
extern crate serde;
3+
4+
5+
use packed_struct::prelude::*;
6+
7+
#[test]
8+
fn test_serialization_traits() {
9+
10+
check_serde_support::<Integer<u8, packed_bits::Bits8>>();
11+
check_serde_support::<PackingError>();
12+
check_serde_support::<BitOne>();
13+
check_serde_support::<BitZero>();
14+
check_serde_support::<ReservedBits<u8, packed_bits::Bits8>>();
15+
}
16+
17+
fn check_serde_support<'a, T>()
18+
where
19+
T: serde::Serialize,
20+
T: serde::Deserialize<'a>
21+
{
22+
}

0 commit comments

Comments
 (0)