semver: add custom errors (#9493)

pull/9510/head
Atakan Yenel 2021-03-29 11:17:00 +02:00 committed by GitHub
parent cabbf93faa
commit 89082de5d1
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 51 additions and 6 deletions

20
examples/errors.v 100644
View File

@ -0,0 +1,20 @@
import semver
fn main() {
semver.from('asd') or { check_error(err) }
semver.from('') or { check_error(err) }
}
fn check_error(err IError) {
match err {
semver.InvalidVersionFormatError {
println('wrong format')
}
semver.EmptyInputError {
println('empty input')
}
else {
println('unknown error')
}
}
}

View File

@ -29,6 +29,16 @@ struct Range {
comparator_sets []ComparatorSet comparator_sets []ComparatorSet
} }
struct InvalidComparatorCountError {
msg string
code int
}
struct InvalidComparatorFormatError {
msg string
code int
}
fn (r Range) satisfies(ver Version) bool { fn (r Range) satisfies(ver Version) bool {
mut final_result := false mut final_result := false
for set in r.comparator_sets { for set in r.comparator_sets {
@ -74,12 +84,16 @@ fn parse_range(input string) ?Range {
fn parse_comparator_set(input string) ?ComparatorSet { fn parse_comparator_set(input string) ?ComparatorSet {
raw_comparators := input.split(semver.comparator_sep) raw_comparators := input.split(semver.comparator_sep)
if raw_comparators.len > 2 { if raw_comparators.len > 2 {
return error('Invalid format of comparator set for input "$input"') return IError(&InvalidComparatorFormatError{
msg: 'Invalid format of comparator set for input "$input"'
})
} }
mut comparators := []Comparator{} mut comparators := []Comparator{}
for raw_comp in raw_comparators { for raw_comp in raw_comparators {
c := parse_comparator(raw_comp) or { c := parse_comparator(raw_comp) or {
return error('Invalid comparator "$raw_comp" in input "$input"') return IError(&InvalidComparatorFormatError{
msg: 'Invalid comparator "$raw_comp" in input "$input"'
})
} }
comparators << c comparators << c
} }

View File

@ -19,15 +19,27 @@ pub enum Increment {
patch patch
} }
struct EmptyInputError {
msg string = 'Empty input'
code int
}
struct InvalidVersionFormatError {
msg string
code int
}
// * Constructor. // * Constructor.
// from returns a `Version` structure parsed from `input` `string`. // from returns a `Version` structure parsed from `input` `string`.
pub fn from(input string) ?Version { pub fn from(input string) ?Version {
if input.len == 0 { if input.len == 0 {
return error('Empty input') return IError(&EmptyInputError{})
} }
raw_version := parse(input) raw_version := parse(input)
version := raw_version.validate() or { version := raw_version.validate() or {
return error('Invalid version format for input "$input"') return IError(&InvalidVersionFormatError{
msg: 'Invalid version format for input "$input"'
})
} }
return version return version
} }
@ -88,8 +100,7 @@ v := semver.coerce('1.3-RC1-b2') or { semver.Version{} }
assert v.satisfies('>1.0 <2.0') == true // 1.3.0 assert v.satisfies('>1.0 <2.0') == true // 1.3.0
*/ */
pub fn coerce(input string) ?Version { pub fn coerce(input string) ?Version {
ver := coerce_version(input) or { return error('Invalid version for input "$input"') } return coerce_version(input)
return ver
} }
// is_valid returns `true` if the `input` `string` can be converted to // is_valid returns `true` if the `input` `string` can be converted to