Skip to content

Commit 3f0bedd

Browse files
authored
Merge pull request #609 from justahero/sebastian/refactor-validate-signature
Refactor `Validate` trait to simplify return type
2 parents a66c2bf + 7371323 commit 3f0bedd

32 files changed

+811
-1325
lines changed

cargo-cyclonedx/src/generator.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ impl SbomGenerator {
9999
let bom = generator.create_bom(member, &dependencies, &pruned_resolve)?;
100100

101101
if cfg!(debug_assertions) {
102-
let result = bom.validate().unwrap();
102+
let result = bom.validate();
103103
if let ValidationResult::Failed { reasons } = result {
104104
panic!("The generated SBOM failed validation: {:?}", &reasons);
105105
}

cargo-cyclonedx/src/purl.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ fn to_purl_subpath(path: &Utf8Path) -> String {
8282

8383
fn assert_validation_passes(purl: &CdxPurl) {
8484
use cyclonedx_bom::validation::{Validate, ValidationResult};
85-
assert_eq!(purl.validate().unwrap(), ValidationResult::Passed);
85+
assert_eq!(purl.validate(), ValidationResult::Passed);
8686
}
8787

8888
#[cfg(test)]

cyclonedx-bom/src/external_models/date_time.rs

Lines changed: 10 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,7 @@ use std::convert::TryFrom;
2121
use thiserror::Error;
2222
use time::{format_description::well_known::Iso8601, OffsetDateTime};
2323

24-
use crate::validation::{
25-
FailureReason, Validate, ValidationContext, ValidationError, ValidationResult,
26-
};
24+
use crate::validation::{Validate, ValidationContext, ValidationResult};
2725

2826
/// For the purposes of CycloneDX SBOM documents, `DateTime` is a ISO8601 formatted timestamp
2927
///
@@ -67,18 +65,10 @@ impl TryFrom<String> for DateTime {
6765
}
6866

6967
impl Validate for DateTime {
70-
fn validate_with_context(
71-
&self,
72-
context: ValidationContext,
73-
) -> Result<ValidationResult, ValidationError> {
68+
fn validate_with_context(&self, context: ValidationContext) -> ValidationResult {
7469
match OffsetDateTime::parse(&self.0.to_string(), &Iso8601::DEFAULT) {
75-
Ok(_) => Ok(ValidationResult::Passed),
76-
Err(_) => Ok(ValidationResult::Failed {
77-
reasons: vec![FailureReason {
78-
message: "DateTime does not conform to ISO 8601".to_string(),
79-
context,
80-
}],
81-
}),
70+
Ok(_) => ValidationResult::Passed,
71+
Err(_) => ValidationResult::failure("DateTime does not conform to ISO 8601", context),
8272
}
8373
}
8474
}
@@ -101,32 +91,25 @@ pub enum DateTimeError {
10191
#[cfg(test)]
10292
mod test {
10393
use super::*;
104-
use crate::validation::FailureReason;
10594
use pretty_assertions::assert_eq;
10695

10796
#[test]
10897
fn valid_datetimes_should_pass_validation() {
109-
let validation_result = DateTime("1969-06-28T01:20:00.00-04:00".to_string())
110-
.validate_with_context(ValidationContext::default())
111-
.expect("Error while validating");
98+
let validation_result = DateTime("1969-06-28T01:20:00.00-04:00".to_string()).validate();
11299

113100
assert_eq!(validation_result, ValidationResult::Passed)
114101
}
115102

116103
#[test]
117104
fn invalid_datetimes_should_fail_validation() {
118-
let validation_result = DateTime("invalid date".to_string())
119-
.validate_with_context(ValidationContext::default())
120-
.expect("Error while validating");
105+
let validation_result = DateTime("invalid date".to_string()).validate();
121106

122107
assert_eq!(
123108
validation_result,
124-
ValidationResult::Failed {
125-
reasons: vec![FailureReason {
126-
message: "DateTime does not conform to ISO 8601".to_string(),
127-
context: ValidationContext::default()
128-
}]
129-
}
109+
ValidationResult::failure(
110+
"DateTime does not conform to ISO 8601",
111+
ValidationContext::default()
112+
)
130113
)
131114
}
132115
}

cyclonedx-bom/src/external_models/normalized_string.rs

Lines changed: 13 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,7 @@
1616
* SPDX-License-Identifier: Apache-2.0
1717
*/
1818

19-
use crate::validation::{
20-
FailureReason, Validate, ValidationContext, ValidationError, ValidationResult,
21-
};
19+
use crate::validation::{Validate, ValidationContext, ValidationResult};
2220
use std::fmt::Display;
2321
use std::ops::Deref;
2422

@@ -68,32 +66,25 @@ impl Display for NormalizedString {
6866
}
6967

7068
impl Validate for NormalizedString {
71-
fn validate_with_context(
72-
&self,
73-
context: ValidationContext,
74-
) -> Result<ValidationResult, ValidationError> {
69+
fn validate_with_context(&self, context: ValidationContext) -> ValidationResult {
7570
if self.0.contains("\r\n")
7671
|| self.0.contains('\r')
7772
|| self.0.contains('\n')
7873
|| self.0.contains('\t')
7974
{
80-
return Ok(ValidationResult::Failed {
81-
reasons: vec![FailureReason {
82-
message: "NormalizedString contains invalid characters \\r \\n \\t or \\r\\n"
83-
.to_string(),
84-
context,
85-
}],
86-
});
75+
return ValidationResult::failure(
76+
"NormalizedString contains invalid characters \\r \\n \\t or \\r\\n",
77+
context,
78+
);
8779
}
8880

89-
Ok(ValidationResult::Passed)
81+
ValidationResult::Passed
9082
}
9183
}
9284

9385
#[cfg(test)]
9486
mod test {
9587
use super::*;
96-
use crate::validation::FailureReason;
9788
use pretty_assertions::assert_eq;
9889

9990
#[test]
@@ -114,28 +105,21 @@ mod test {
114105

115106
#[test]
116107
fn it_should_pass_validation() {
117-
let validation_result = NormalizedString("no_whitespace".to_string())
118-
.validate_with_context(ValidationContext::default())
119-
.expect("Error while validating");
108+
let validation_result = NormalizedString("no_whitespace".to_string()).validate();
120109

121110
assert_eq!(validation_result, ValidationResult::Passed);
122111
}
123112

124113
#[test]
125114
fn it_should_fail_validation() {
126-
let validation_result = NormalizedString("spaces and\ttabs".to_string())
127-
.validate_with_context(ValidationContext::default())
128-
.expect("Error while validating");
115+
let validation_result = NormalizedString("spaces and\ttabs".to_string()).validate();
129116

130117
assert_eq!(
131118
validation_result,
132-
ValidationResult::Failed {
133-
reasons: vec![FailureReason {
134-
message: "NormalizedString contains invalid characters \\r \\n \\t or \\r\\n"
135-
.to_string(),
136-
context: ValidationContext::default()
137-
}]
138-
}
119+
ValidationResult::failure(
120+
"NormalizedString contains invalid characters \\r \\n \\t or \\r\\n",
121+
ValidationContext::default()
122+
)
139123
);
140124
}
141125
}

cyclonedx-bom/src/external_models/spdx.rs

Lines changed: 14 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ use std::convert::TryFrom;
2121
use spdx::{Expression, ParseMode};
2222
use thiserror::Error;
2323

24-
use crate::validation::{FailureReason, Validate, ValidationResult};
24+
use crate::validation::{Validate, ValidationResult};
2525

2626
/// An identifier for a single, specific license
2727
///
@@ -84,15 +84,10 @@ impl Validate for SpdxIdentifier {
8484
fn validate_with_context(
8585
&self,
8686
context: crate::validation::ValidationContext,
87-
) -> Result<ValidationResult, crate::validation::ValidationError> {
87+
) -> ValidationResult {
8888
match Self::try_from(self.0.clone()) {
89-
Ok(_) => Ok(ValidationResult::Passed),
90-
Err(_) => Ok(ValidationResult::Failed {
91-
reasons: vec![FailureReason {
92-
message: "SPDX identifier is not valid".to_string(),
93-
context,
94-
}],
95-
}),
89+
Ok(_) => ValidationResult::Passed,
90+
Err(_) => ValidationResult::failure("SPDX identifier is not valid", context),
9691
}
9792
}
9893
}
@@ -184,15 +179,10 @@ impl Validate for SpdxExpression {
184179
fn validate_with_context(
185180
&self,
186181
context: crate::validation::ValidationContext,
187-
) -> Result<crate::validation::ValidationResult, crate::validation::ValidationError> {
182+
) -> ValidationResult {
188183
match SpdxExpression::try_from(self.0.clone()) {
189-
Ok(_) => Ok(ValidationResult::Passed),
190-
Err(_) => Ok(ValidationResult::Failed {
191-
reasons: vec![FailureReason {
192-
message: "SPDX expression is not valid".to_string(),
193-
context,
194-
}],
195-
}),
184+
Ok(_) => ValidationResult::Passed,
185+
Err(_) => ValidationResult::failure("SPDX expression is not valid", context),
196186
}
197187
}
198188
}
@@ -208,7 +198,7 @@ pub enum SpdxExpressionError {
208198

209199
#[cfg(test)]
210200
mod test {
211-
use crate::validation::{FailureReason, ValidationContext, ValidationResult};
201+
use crate::validation::{ValidationContext, ValidationResult};
212202

213203
use super::*;
214204
use pretty_assertions::assert_eq;
@@ -257,27 +247,18 @@ mod test {
257247

258248
#[test]
259249
fn valid_spdx_identifiers_should_pass_validation() {
260-
let validation_result = SpdxIdentifier("MIT".to_string())
261-
.validate_with_context(ValidationContext::default())
262-
.expect("Error while validating");
250+
let validation_result = SpdxIdentifier("MIT".to_string()).validate();
263251

264252
assert_eq!(validation_result, ValidationResult::Passed);
265253
}
266254

267255
#[test]
268256
fn invalid_spdx_identifiers_should_fail_validation() {
269-
let validation_result = SpdxIdentifier("MIT OR Apache-2.0".to_string())
270-
.validate_with_context(ValidationContext::default())
271-
.expect("Error while validating");
257+
let validation_result = SpdxIdentifier("MIT OR Apache-2.0".to_string()).validate();
272258

273259
assert_eq!(
274260
validation_result,
275-
ValidationResult::Failed {
276-
reasons: vec![FailureReason {
277-
message: "SPDX identifier is not valid".to_string(),
278-
context: ValidationContext::default()
279-
}]
280-
}
261+
ValidationResult::failure("SPDX identifier is not valid", ValidationContext::default()),
281262
);
282263
}
283264

@@ -307,27 +288,18 @@ mod test {
307288

308289
#[test]
309290
fn valid_spdx_expressions_should_pass_validation() {
310-
let validation_result = SpdxExpression("MIT OR Apache-2.0".to_string())
311-
.validate_with_context(ValidationContext::default())
312-
.expect("Error while validating");
291+
let validation_result = SpdxExpression("MIT OR Apache-2.0".to_string()).validate();
313292

314293
assert_eq!(validation_result, ValidationResult::Passed);
315294
}
316295

317296
#[test]
318297
fn invalid_spdx_expressions_should_fail_validation() {
319-
let validation_result = SpdxExpression("not a real license".to_string())
320-
.validate_with_context(ValidationContext::default())
321-
.expect("Error while validating");
298+
let validation_result = SpdxExpression("not a real license".to_string()).validate();
322299

323300
assert_eq!(
324301
validation_result,
325-
ValidationResult::Failed {
326-
reasons: vec![FailureReason {
327-
message: "SPDX expression is not valid".to_string(),
328-
context: ValidationContext::default()
329-
}]
330-
}
302+
ValidationResult::failure("SPDX expression is not valid", ValidationContext::default())
331303
);
332304
}
333305
}

0 commit comments

Comments
 (0)