Skip to content

Commit

Permalink
Merge pull request #12 from jhheider/add-serde-feature
Browse files Browse the repository at this point in the history
add feature: "serde"
  • Loading branch information
jhheider authored Jan 8, 2025
2 parents 21a52a1 + 40a7f36 commit 706e7a1
Show file tree
Hide file tree
Showing 9 changed files with 183 additions and 8 deletions.
1 change: 1 addition & 0 deletions .github/workflows/check-and-lint.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ jobs:
- uses: actions-rs/cargo@v1
with:
command: check
args: --all-features
env:
RUSTFLAGS: "-D warnings"

Expand Down
2 changes: 1 addition & 1 deletion .justfile
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ default:

# Generate coverage/lcov.info
coverage:
cargo tarpaulin --engine ptrace -o lcov --output-dir coverage
cargo tarpaulin --engine ptrace -o lcov --output-dir coverage --all --all-targets --all-features

# For getting ptrace as html on macos
docker-coverage:
Expand Down
95 changes: 93 additions & 2 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 2 additions & 2 deletions cli/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "semverator"
version = "0.8.0"
version = "0.9.0"
edition = "2021"
license = "Apache-2.0"
readme = "../README.md"
Expand All @@ -13,7 +13,7 @@ categories = ["command-line-utilities"]
[dependencies]
anyhow = "1.0.75"
clap = { version = '4.4.2', features = ['cargo'] }
libsemverator = { path = "../lib", version = "0.8.0" }
libsemverator = { path = "../lib", version = "0.9.0" }

[lints.rust]
unexpected_cfgs = { level = "allow", check-cfg = ['cfg(tarpaulin_include)'] }
10 changes: 9 additions & 1 deletion lib/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "libsemverator"
version = "0.8.0"
version = "0.9.0"
edition = "2021"
license = "Apache-2.0"
readme = "../README.md"
Expand All @@ -10,13 +10,21 @@ repository = "https://github.com/jhheider/semverator"
keywords = ["semver", "semantic", "versioning", "pkgx"]
categories = ["command-line-utilities"]

[features]
serde = ["dep:serde", "dep:serde_json"]

[lib]
crate-type = ["cdylib", "rlib"]

[dependencies]
anyhow = "1.0.75"
lazy_static = "1.5.0"
regex = "1.9.5"
serde = { version = "1.0.217", optional = true }
serde_json = { version = "1.0.135", optional = true }

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

[dev-dependencies]
serde_test = "1.0.177"
23 changes: 23 additions & 0 deletions lib/src/range/mod.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
use crate::semver::Semver;
#[cfg(feature = "serde")]
use serde::{Deserialize, Deserializer, Serialize, Serializer};
use std::{
fmt,
hash::{Hash, Hasher},
Expand Down Expand Up @@ -118,3 +120,24 @@ fn at(left: &Semver, right: &Semver) -> bool {

true
}

impl PartialEq for Range {
fn eq(&self, other: &Self) -> bool {
self.set == other.set
}
}

#[cfg(feature = "serde")]
impl Serialize for Range {
fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
serializer.serialize_str(&format!("{self}"))
}
}

#[cfg(feature = "serde")]
impl<'de> Deserialize<'de> for Range {
fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
let s = String::deserialize(deserializer)?;
Range::parse(&s).map_err(serde::de::Error::custom)
}
}
17 changes: 17 additions & 0 deletions lib/src/semver/mod.rs
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
#[cfg(feature = "serde")]
use serde::{Deserialize, Deserializer, Serialize, Serializer};
use std::fmt;

pub mod bump;
Expand Down Expand Up @@ -67,3 +69,18 @@ impl fmt::Display for Semver {
Ok(())
}
}

#[cfg(feature = "serde")]
impl Serialize for Semver {
fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
serializer.serialize_str(&self.raw)
}
}

#[cfg(feature = "serde")]
impl<'de> Deserialize<'de> for Semver {
fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
let s = String::deserialize(deserializer)?;
Semver::parse(&s).map_err(serde::de::Error::custom)
}
}
22 changes: 20 additions & 2 deletions lib/src/tests/range.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
use anyhow::Result;

use crate::{range::Range, semver::Semver};
use anyhow::Result;
#[cfg(feature = "serde")]
use serde_test::{assert_tokens, Token};

#[test]
fn test_parse() -> Result<()> {
Expand Down Expand Up @@ -279,3 +280,20 @@ fn test_display() -> Result<()> {

Ok(())
}

#[cfg(feature = "serde")]
#[test]
fn test_serde() -> Result<()> {
let ra = Range::parse("^3.7")?;
let rb = Range::parse("=3.11")?;
let rc = Range::parse("^3.9")?;

assert_tokens(&ra, &[Token::Str("^3.7")]);
assert_tokens(&rb, &[Token::Str("=3.11")]);
assert_tokens(&rc, &[Token::Str("^3.9")]);

let rd = serde_json::from_str::<Range>("\"your mom\"");
assert!(rd.is_err());

Ok(())
}
17 changes: 17 additions & 0 deletions lib/src/tests/semver.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
use crate::semver::{bump::SemverComponent, Semver};
use anyhow::Result;
#[cfg(feature = "serde")]
use serde_test::{assert_tokens, Token};

#[test]
fn test_parse() -> Result<()> {
Expand Down Expand Up @@ -181,3 +183,18 @@ fn test_display() -> Result<()> {

Ok(())
}

#[cfg(feature = "serde")]
#[test]
fn test_serde() -> Result<()> {
let a = Semver::parse("1.2.3")?;
let b = Semver::parse("1.2.4")?;

assert_tokens(&a, &[Token::Str("1.2.3")]);
assert_tokens(&b, &[Token::Str("1.2.4")]);

let c = serde_json::from_str::<Semver>("\"your mom\"");
assert!(c.is_err());

Ok(())
}

0 comments on commit 706e7a1

Please sign in to comment.