Skip to content

Commit 706e7a1

Browse files
authored
Merge pull request #12 from jhheider/add-serde-feature
add feature: "serde"
2 parents 21a52a1 + 40a7f36 commit 706e7a1

File tree

9 files changed

+183
-8
lines changed

9 files changed

+183
-8
lines changed

.github/workflows/check-and-lint.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ jobs:
2222
- uses: actions-rs/cargo@v1
2323
with:
2424
command: check
25+
args: --all-features
2526
env:
2627
RUSTFLAGS: "-D warnings"
2728

.justfile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ default:
44

55
# Generate coverage/lcov.info
66
coverage:
7-
cargo tarpaulin --engine ptrace -o lcov --output-dir coverage
7+
cargo tarpaulin --engine ptrace -o lcov --output-dir coverage --all --all-targets --all-features
88

99
# For getting ptrace as html on macos
1010
docker-coverage:

Cargo.lock

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

cli/Cargo.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "semverator"
3-
version = "0.8.0"
3+
version = "0.9.0"
44
edition = "2021"
55
license = "Apache-2.0"
66
readme = "../README.md"
@@ -13,7 +13,7 @@ categories = ["command-line-utilities"]
1313
[dependencies]
1414
anyhow = "1.0.75"
1515
clap = { version = '4.4.2', features = ['cargo'] }
16-
libsemverator = { path = "../lib", version = "0.8.0" }
16+
libsemverator = { path = "../lib", version = "0.9.0" }
1717

1818
[lints.rust]
1919
unexpected_cfgs = { level = "allow", check-cfg = ['cfg(tarpaulin_include)'] }

lib/Cargo.toml

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "libsemverator"
3-
version = "0.8.0"
3+
version = "0.9.0"
44
edition = "2021"
55
license = "Apache-2.0"
66
readme = "../README.md"
@@ -10,13 +10,21 @@ repository = "https://github.com/jhheider/semverator"
1010
keywords = ["semver", "semantic", "versioning", "pkgx"]
1111
categories = ["command-line-utilities"]
1212

13+
[features]
14+
serde = ["dep:serde", "dep:serde_json"]
15+
1316
[lib]
1417
crate-type = ["cdylib", "rlib"]
1518

1619
[dependencies]
1720
anyhow = "1.0.75"
1821
lazy_static = "1.5.0"
1922
regex = "1.9.5"
23+
serde = { version = "1.0.217", optional = true }
24+
serde_json = { version = "1.0.135", optional = true }
2025

2126
[lints.rust]
2227
unexpected_cfgs = { level = "allow", check-cfg = ['cfg(tarpaulin_include)'] }
28+
29+
[dev-dependencies]
30+
serde_test = "1.0.177"

lib/src/range/mod.rs

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
use crate::semver::Semver;
2+
#[cfg(feature = "serde")]
3+
use serde::{Deserialize, Deserializer, Serialize, Serializer};
24
use std::{
35
fmt,
46
hash::{Hash, Hasher},
@@ -118,3 +120,24 @@ fn at(left: &Semver, right: &Semver) -> bool {
118120

119121
true
120122
}
123+
124+
impl PartialEq for Range {
125+
fn eq(&self, other: &Self) -> bool {
126+
self.set == other.set
127+
}
128+
}
129+
130+
#[cfg(feature = "serde")]
131+
impl Serialize for Range {
132+
fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
133+
serializer.serialize_str(&format!("{self}"))
134+
}
135+
}
136+
137+
#[cfg(feature = "serde")]
138+
impl<'de> Deserialize<'de> for Range {
139+
fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
140+
let s = String::deserialize(deserializer)?;
141+
Range::parse(&s).map_err(serde::de::Error::custom)
142+
}
143+
}

lib/src/semver/mod.rs

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
#[cfg(feature = "serde")]
2+
use serde::{Deserialize, Deserializer, Serialize, Serializer};
13
use std::fmt;
24

35
pub mod bump;
@@ -67,3 +69,18 @@ impl fmt::Display for Semver {
6769
Ok(())
6870
}
6971
}
72+
73+
#[cfg(feature = "serde")]
74+
impl Serialize for Semver {
75+
fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
76+
serializer.serialize_str(&self.raw)
77+
}
78+
}
79+
80+
#[cfg(feature = "serde")]
81+
impl<'de> Deserialize<'de> for Semver {
82+
fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
83+
let s = String::deserialize(deserializer)?;
84+
Semver::parse(&s).map_err(serde::de::Error::custom)
85+
}
86+
}

lib/src/tests/range.rs

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
1-
use anyhow::Result;
2-
31
use crate::{range::Range, semver::Semver};
2+
use anyhow::Result;
3+
#[cfg(feature = "serde")]
4+
use serde_test::{assert_tokens, Token};
45

56
#[test]
67
fn test_parse() -> Result<()> {
@@ -279,3 +280,20 @@ fn test_display() -> Result<()> {
279280

280281
Ok(())
281282
}
283+
284+
#[cfg(feature = "serde")]
285+
#[test]
286+
fn test_serde() -> Result<()> {
287+
let ra = Range::parse("^3.7")?;
288+
let rb = Range::parse("=3.11")?;
289+
let rc = Range::parse("^3.9")?;
290+
291+
assert_tokens(&ra, &[Token::Str("^3.7")]);
292+
assert_tokens(&rb, &[Token::Str("=3.11")]);
293+
assert_tokens(&rc, &[Token::Str("^3.9")]);
294+
295+
let rd = serde_json::from_str::<Range>("\"your mom\"");
296+
assert!(rd.is_err());
297+
298+
Ok(())
299+
}

lib/src/tests/semver.rs

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
use crate::semver::{bump::SemverComponent, Semver};
22
use anyhow::Result;
3+
#[cfg(feature = "serde")]
4+
use serde_test::{assert_tokens, Token};
35

46
#[test]
57
fn test_parse() -> Result<()> {
@@ -181,3 +183,18 @@ fn test_display() -> Result<()> {
181183

182184
Ok(())
183185
}
186+
187+
#[cfg(feature = "serde")]
188+
#[test]
189+
fn test_serde() -> Result<()> {
190+
let a = Semver::parse("1.2.3")?;
191+
let b = Semver::parse("1.2.4")?;
192+
193+
assert_tokens(&a, &[Token::Str("1.2.3")]);
194+
assert_tokens(&b, &[Token::Str("1.2.4")]);
195+
196+
let c = serde_json::from_str::<Semver>("\"your mom\"");
197+
assert!(c.is_err());
198+
199+
Ok(())
200+
}

0 commit comments

Comments
 (0)