Skip to content

Commit 74261c0

Browse files
authored
impl serde (#8)
1 parent 3965993 commit 74261c0

File tree

4 files changed

+88
-3
lines changed

4 files changed

+88
-3
lines changed

Cargo.lock

Lines changed: 21 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,12 @@ rust-version = "1.85.0"
77
[features]
88
default = ["std"]
99
std = ["num-bigint/std"]
10+
serde = ["dep:serde"]
1011
typesize = ["dep:typesize"]
1112

1213
[dependencies]
13-
num-bigint = { version = "0.4.6", default-features = false }
14+
num-bigint = { version = "0.4", default-features = false }
15+
serde = { version = "1.0", default-features = false, optional = true }
1416
typesize = { version = "0.1", optional = true, default-features = false }
1517

1618
[lints.clippy]

src/lib.rs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,9 @@ use {
3636
std::{cmp, fmt},
3737
};
3838

39+
#[cfg(feature = "serde")]
40+
mod serde;
41+
3942
type BitSliceType = u32;
4043
const BST_BITS: usize = BitSliceType::BITS as usize;
4144
const INLINE_SLICE_PARTS: usize = usize::BITS as usize / BST_BITS;
@@ -661,7 +664,7 @@ macro_rules! impl_binop_prim {
661664
)*};
662665
}
663666

664-
impl_binop_prim!(u8, u16, u32, u64, usize);
667+
impl_binop_prim!(u8, u16, u32, u64, u128, usize);
665668

666669
macro_rules! impl_from {
667670
($($t:ty),+) => {$(
@@ -697,7 +700,7 @@ macro_rules! impl_from {
697700
}
698701
}
699702

700-
impl_from!(u8, u16, u32, u64, usize);
703+
impl_from!(u8, u16, u32, u64, u128, usize);
701704

702705
impl cmp::PartialEq for SmolBitSet {
703706
fn eq(&self, other: &Self) -> bool {

src/serde.rs

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
use crate::SmolBitSet;
2+
use crate::fmt;
3+
4+
use serde::de::{Deserialize, Deserializer, Visitor};
5+
use serde::ser::{Serialize, Serializer};
6+
7+
struct SmolBitSetVisitor;
8+
9+
macro_rules! visit_from {
10+
($($name:ident: $t:ty),+) => {$(
11+
fn $name<E>(self, v: $t) -> Result<Self::Value, E>
12+
where
13+
E: serde::de::Error,
14+
{
15+
Ok(SmolBitSet::from(v))
16+
}
17+
)*}
18+
}
19+
20+
impl Visitor<'_> for SmolBitSetVisitor {
21+
type Value = SmolBitSet;
22+
23+
fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
24+
formatter.write_str("a base 10 representation of a bitset")
25+
}
26+
27+
fn visit_str<E>(self, v: &str) -> Result<Self::Value, E>
28+
where
29+
E: serde::de::Error,
30+
{
31+
v.parse().map_err(|()| E::custom("could not parse bitset"))
32+
}
33+
34+
visit_from!(
35+
visit_u8: u8,
36+
visit_u16: u16,
37+
visit_u32: u32,
38+
visit_u64: u64,
39+
visit_u128: u128
40+
);
41+
}
42+
43+
impl<'de> Deserialize<'de> for SmolBitSet {
44+
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
45+
where
46+
D: Deserializer<'de>,
47+
{
48+
deserializer.deserialize_any(SmolBitSetVisitor)
49+
}
50+
}
51+
52+
impl Serialize for SmolBitSet {
53+
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
54+
where
55+
S: Serializer,
56+
{
57+
serializer.serialize_str(self.to_string().as_str())
58+
}
59+
}

0 commit comments

Comments
 (0)