Skip to content

Commit 6897c15

Browse files
authored
Merge pull request #18 from rodneylab/refactor__simplify_semver_logic
refactor: 🏄🏽 simplify semver logic
2 parents 922769e + 3deca57 commit 6897c15

File tree

5 files changed

+305
-169
lines changed

5 files changed

+305
-169
lines changed

Cargo.lock

Lines changed: 7 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: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ env_logger = "0.11.6"
2727
git2 = "0.20.0"
2828
log = "0.4.22"
2929
nom = "7.1.3"
30+
semver = "1.0.24"
3031
serde = { version = "1.0.217", features = ["derive"] }
3132
toml = "0.8.19"
3233

justfile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ coverage:
1515
LLVM_PROFILE_FILE="rust_crate_diffs-%p-%m.profraw" cargo test
1616
grcov . -s . --binary-path ./target/debug/ -t html --branch --ignore-not-existing \
1717
-o ./target/debug/coverage/
18-
open ./target/debug/coverage
18+
open --reveal ./target/debug/coverage
1919
sed -i '' "s|href=\"https://cdn.jsdelivr.net/npm/[email protected]/css/bulma.min.css\"|href=\"file://`pwd`/.cache/bulma.min.css\"|g" ./target/debug/coverage/**/*.html
2020
mkdir -p .cache
2121
curl --time-cond .cache/bulma.min.css -C - -Lo .cache/bulma.min.css \

src/domain/cargo_toml/mod.rs

Lines changed: 42 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,32 @@ impl File {
6565
})
6666
}
6767

68+
fn get_version(value: &CargoDependencyValue) -> anyhow::Result<SemverVersion> {
69+
match value {
70+
CargoDependencyValue::Simple(version) => SemverVersion::new(version).map_err(|error| {
71+
anyhow!(
72+
"Unexpected semver {version} found while computing dependency changes: \
73+
{error}",
74+
)
75+
}),
76+
CargoDependencyValue::Detailed(DetailedCargoDependency { version, .. }) => {
77+
SemverVersion::new(version).map_err(|_| {
78+
anyhow!(
79+
"Unexpected semver version `{version}` found while computing \
80+
dependency changes"
81+
)
82+
})
83+
}
84+
CargoDependencyValue::Git(GitCargoDependency { git }) => {
85+
log::warn!(
86+
"Git dependency `{git}` found, but version change detection for git \
87+
dependencies is not currently supported"
88+
);
89+
SemverVersion::new("0").map_err(|_| unreachable!("Version 0 should be valid"))
90+
}
91+
}
92+
}
93+
6894
fn get_changes_from_current_dependencies(
6995
current_dependencies: &BTreeMap<String, CargoDependencyValue>,
7096
previous_dependencies: &BTreeMap<String, CargoDependencyValue>,
@@ -73,53 +99,11 @@ impl File {
7399
result: &mut String,
74100
) -> anyhow::Result<()> {
75101
for (name, current_value) in current_dependencies {
76-
let current_version = match current_value {
77-
CargoDependencyValue::Simple(version) => {
78-
match SemverVersion::new(version) {
79-
Ok(value) => value,
80-
Err(error) => return Err(anyhow!(error).context(
81-
"Unexpected semver version found while computing dependency changes",
82-
)),
83-
}
84-
}
85-
CargoDependencyValue::Detailed(DetailedCargoDependency { version, .. }) => {
86-
match SemverVersion::new(version) {
87-
Ok(value)=> value,
88-
Err(error) => return Err(anyhow!(error).context(
89-
"Unexpected semver version `{version}` found while computing dependency changes"
90-
)
91-
)
92-
}
93-
},
94-
CargoDependencyValue::Git(GitCargoDependency { git }) => {
95-
log::warn!("Git dependency `{git}` found, but version change detection for git dependencies is not currently supported");
96-
SemverVersion::new("0").expect("`0` should be a valid semver version")
97-
}
98-
};
102+
let current_version = Self::get_version(current_value)?;
99103
if let Some(previous_value) = previous_dependencies.get(name) {
100104
// Handle dependencies in previous and current (filtering for ones with changed
101105
// versions)
102-
let previous_version = match previous_value {
103-
CargoDependencyValue::Simple(version) => match SemverVersion::new(version) {
104-
Ok(value) => value,
105-
Err(error) => return Err(anyhow!(error).context(
106-
"Unexpected semver version found while computing dependency changes",
107-
)),
108-
},
109-
CargoDependencyValue::Detailed(DetailedCargoDependency { version, .. }) => {
110-
match SemverVersion::new(version){
111-
Ok(value) => value,
112-
Err(error) => return Err(anyhow!(error).context(
113-
"Unexpected semver version `{version}` found while computing dependency changes"
114-
)
115-
)
116-
}
117-
}
118-
CargoDependencyValue::Git(GitCargoDependency { git }) => {
119-
log::warn!("Git dependency `{git}` found, but version change detection for git dependencies is not currently supported");
120-
SemverVersion::new("0").expect("`0` should be a valid semver version")
121-
}
122-
};
106+
let previous_version = Self::get_version(previous_value)?;
123107

124108
// Housekeeping to make previous keys into a list of only crates removed in the
125109
// current Cargo.toml
@@ -130,42 +114,48 @@ Ok(value) => value,
130114
Some(Ordering::Greater) => {
131115
if let Some(label_value) = label {
132116
result.push_str(&format!(
133-
"{change_type} bump {name} {label_value} from {previous_version} to {current_version}\n",
117+
"{change_type} bump {name} {label_value} from {previous_version} \
118+
to {current_version}\n",
134119
));
135120
} else {
136121
result.push_str(&format!(
137-
"{change_type} bump {name} from {previous_version} to {current_version}\n",
122+
"{change_type} bump {name} from {previous_version} to \
123+
{current_version}\n",
138124
));
139125
}
140126
}
141127
Some(Ordering::Equal) => {}
142128
Some(Ordering::Less) => {
143129
if let Some(label_value) = label {
144130
result.push_str(&format!(
145-
"{change_type} drop {name} {label_value} from {previous_version} to {current_version}\n"
131+
"{change_type} drop {name} {label_value} from {previous_version} to \
132+
{current_version}\n"
146133
));
147134
} else {
148135
result.push_str(&format!(
149-
"{change_type} drop {name} from {previous_version} to {current_version}\n"
150-
));
136+
"{change_type} drop {name} from {previous_version} to \
137+
{current_version}\n"
138+
));
151139
}
152140
}
153141
None => {
154142
if let Some(label_value) = label {
155143
result.push_str(&format!(
156-
"{change_type} change {name} {label_value} from {previous_version} to {current_version}\n"
144+
"{change_type} change {name} {label_value} from {previous_version} \
145+
to {current_version}\n"
157146
));
158147
} else {
159148
result.push_str(&format!(
160-
"{change_type} change {name} from {previous_version} to {current_version}\n"
149+
"{change_type} change {name} from {previous_version} to \
150+
{current_version}\n"
161151
));
162152
}
163153
}
164154
}
165155
} else {
166156
// Handle added dependencies
167157
if let Some(label_value) = label {
168-
result.push_str(&format!("✨ add {name} {label_value} {current_version}\n",));
158+
result.push_str(&format!("✨ add {name} {label_value} {current_version}\n"));
169159
} else {
170160
result.push_str(&format!("✨ add {name} {current_version}\n",));
171161
}

0 commit comments

Comments
 (0)