Skip to content

Commit 028a235

Browse files
committed
Refactor valid_feature function to return
AppResult. Signed-off-by: hi-rustin <[email protected]>
1 parent 0b5f262 commit 028a235

File tree

4 files changed

+29
-35
lines changed

4 files changed

+29
-35
lines changed

src/controllers/krate/publish.rs

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -244,9 +244,7 @@ pub async fn publish(app: AppState, req: BytesRequest) -> AppResult<Json<GoodCra
244244
}
245245

246246
for value in values.iter() {
247-
if !Crate::valid_feature(value) {
248-
return Err(cargo_err(&format!("\"{value}\" is an invalid feature name")));
249-
}
247+
Crate::valid_feature(value)?;
250248
}
251249
}
252250

@@ -577,11 +575,7 @@ pub fn validate_dependency(dep: &EncodableCrateDependency) -> AppResult<()> {
577575
Crate::valid_name(&dep.name)?;
578576

579577
for feature in &dep.features {
580-
if !Crate::valid_feature(feature) {
581-
return Err(cargo_err(&format_args!(
582-
"\"{feature}\" is an invalid feature name",
583-
)));
584-
}
578+
Crate::valid_feature(feature)?;
585579
}
586580

587581
if let Some(registry) = &dep.registry {

src/models/krate.rs

Lines changed: 25 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -288,15 +288,15 @@ impl Crate {
288288
Ok(())
289289
}
290290

291-
/// Validates a whole feature string, `features = ["THIS", "ALL/THIS"]`.
292-
pub fn valid_feature(name: &str) -> bool {
291+
/// Validates a whole feature string, `features = ["THIS", "and/THIS", "dep:THIS", "dep?/THIS"]`.
292+
pub fn valid_feature(name: &str) -> AppResult<()> {
293293
match name.split_once('/') {
294294
Some((dep, dep_feat)) => {
295295
let dep = dep.strip_suffix('?').unwrap_or(dep);
296-
Crate::valid_dependency_name(dep).is_ok()
297-
&& Crate::valid_feature_name(dep_feat).is_ok()
296+
Crate::valid_dependency_name(dep)?;
297+
Crate::valid_feature_name(dep_feat)
298298
}
299-
None => Crate::valid_feature_name(name.strip_prefix("dep:").unwrap_or(name)).is_ok(),
299+
None => Crate::valid_feature_name(name.strip_prefix("dep:").unwrap_or(name)),
300300
}
301301
}
302302

@@ -567,25 +567,25 @@ mod tests {
567567

568568
#[test]
569569
fn valid_feature_names() {
570-
assert!(Crate::valid_feature("foo"));
571-
assert!(Crate::valid_feature("1foo"));
572-
assert!(Crate::valid_feature("_foo"));
573-
assert!(Crate::valid_feature("_foo-_+.1"));
574-
assert!(Crate::valid_feature("_foo-_+.1"));
575-
assert!(!Crate::valid_feature(""));
576-
assert!(!Crate::valid_feature("/"));
577-
assert!(!Crate::valid_feature("%/%"));
578-
assert!(Crate::valid_feature("a/a"));
579-
assert!(Crate::valid_feature("32-column-tables"));
580-
assert!(Crate::valid_feature("c++20"));
581-
assert!(Crate::valid_feature("krate/c++20"));
582-
assert!(!Crate::valid_feature("c++20/wow"));
583-
assert!(Crate::valid_feature("foo?/bar"));
584-
assert!(Crate::valid_feature("dep:foo"));
585-
assert!(!Crate::valid_feature("dep:foo?/bar"));
586-
assert!(!Crate::valid_feature("foo/?bar"));
587-
assert!(!Crate::valid_feature("foo?bar"));
588-
assert!(Crate::valid_feature("bar.web"));
589-
assert!(Crate::valid_feature("foo/bar.web"));
570+
assert!(Crate::valid_feature("foo").is_ok());
571+
assert!(Crate::valid_feature("1foo").is_ok());
572+
assert!(Crate::valid_feature("_foo").is_ok());
573+
assert!(Crate::valid_feature("_foo-_+.1").is_ok());
574+
assert!(Crate::valid_feature("_foo-_+.1").is_ok());
575+
assert!(Crate::valid_feature("").is_err());
576+
assert!(Crate::valid_feature("/").is_err());
577+
assert!(Crate::valid_feature("%/%").is_err());
578+
assert!(Crate::valid_feature("a/a").is_ok());
579+
assert!(Crate::valid_feature("32-column-tables").is_ok());
580+
assert!(Crate::valid_feature("c++20").is_ok());
581+
assert!(Crate::valid_feature("krate/c++20").is_ok());
582+
assert!(Crate::valid_feature("c++20/wow").is_err());
583+
assert!(Crate::valid_feature("foo?/bar").is_ok());
584+
assert!(Crate::valid_feature("dep:foo").is_ok());
585+
assert!(Crate::valid_feature("dep:foo?/bar").is_err());
586+
assert!(Crate::valid_feature("foo/?bar").is_err());
587+
assert!(Crate::valid_feature("foo?bar").is_err());
588+
assert!(Crate::valid_feature("bar.web").is_ok());
589+
assert!(Crate::valid_feature("foo/bar.web").is_ok());
590590
}
591591
}

src/tests/krate/publish/snapshots/all__krate__publish__dependencies__invalid_feature_name.snap

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ expression: response.into_json()
55
{
66
"errors": [
77
{
8-
"detail": "\"🍺\" is an invalid feature name"
8+
"detail": "invalid character `🍺` in feature `🍺`, the first character must be a Unicode XID start character or digit (most letters or `_` or `0` to `9`)"
99
}
1010
]
1111
}

src/tests/krate/publish/snapshots/all__krate__publish__features__invalid_feature.snap

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ expression: response.into_json()
55
{
66
"errors": [
77
{
8-
"detail": "\"!bar\" is an invalid feature name"
8+
"detail": "invalid character `!` in feature `!bar`, the first character must be a Unicode XID start character or digit (most letters or `_` or `0` to `9`)"
99
}
1010
]
1111
}

0 commit comments

Comments
 (0)