From 89082de5d14cbc928a80e854619f8121adbdcfcd Mon Sep 17 00:00:00 2001 From: Atakan Yenel Date: Mon, 29 Mar 2021 11:17:00 +0200 Subject: [PATCH] semver: add custom errors (#9493) --- examples/errors.v | 20 ++++++++++++++++++++ vlib/semver/range.v | 18 ++++++++++++++++-- vlib/semver/semver.v | 19 +++++++++++++++---- 3 files changed, 51 insertions(+), 6 deletions(-) create mode 100644 examples/errors.v diff --git a/examples/errors.v b/examples/errors.v new file mode 100644 index 000000000..e763fcfd0 --- /dev/null +++ b/examples/errors.v @@ -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') + } + } +} diff --git a/vlib/semver/range.v b/vlib/semver/range.v index 3e519c0fa..31333c90e 100644 --- a/vlib/semver/range.v +++ b/vlib/semver/range.v @@ -29,6 +29,16 @@ struct Range { comparator_sets []ComparatorSet } +struct InvalidComparatorCountError { + msg string + code int +} + +struct InvalidComparatorFormatError { + msg string + code int +} + fn (r Range) satisfies(ver Version) bool { mut final_result := false for set in r.comparator_sets { @@ -74,12 +84,16 @@ fn parse_range(input string) ?Range { fn parse_comparator_set(input string) ?ComparatorSet { raw_comparators := input.split(semver.comparator_sep) 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{} for raw_comp in raw_comparators { 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 } diff --git a/vlib/semver/semver.v b/vlib/semver/semver.v index cc6fb7473..c35bbfb99 100644 --- a/vlib/semver/semver.v +++ b/vlib/semver/semver.v @@ -19,15 +19,27 @@ pub enum Increment { patch } +struct EmptyInputError { + msg string = 'Empty input' + code int +} + +struct InvalidVersionFormatError { + msg string + code int +} + // * Constructor. // from returns a `Version` structure parsed from `input` `string`. pub fn from(input string) ?Version { if input.len == 0 { - return error('Empty input') + return IError(&EmptyInputError{}) } raw_version := parse(input) 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 } @@ -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 */ pub fn coerce(input string) ?Version { - ver := coerce_version(input) or { return error('Invalid version for input "$input"') } - return ver + return coerce_version(input) } // is_valid returns `true` if the `input` `string` can be converted to -- 2.30.2