@@ -7,45 +7,35 @@ use std::cmp::Ordering;
7
7
impl Cheatcode for foundryVersionCmpCall {
8
8
fn apply ( & self , _state : & mut Cheatcodes ) -> Result {
9
9
let Self { version } = self ;
10
-
11
- if version. contains ( "+" ) || version. contains ( "-" ) {
12
- return Err ( fmt_err ! ( "Version must be in only major.minor.patch format" ) ) ;
13
- }
14
-
15
- let parsed_version = Version :: parse ( version)
16
- . map_err ( |e| fmt_err ! ( "Invalid semver format '{}': {}" , version, e) ) ?;
17
- let current_semver = Version :: parse ( SEMVER_VERSION )
18
- . map_err ( |_| fmt_err ! ( "Invalid current version format" ) ) ?;
19
-
20
- let current_version =
21
- Version :: new ( current_semver. major , current_semver. minor , current_semver. patch ) ;
22
- // Note: returns -1 if current < provided, 0 if equal, 1 if current > provided.
23
- let cmp_result = match current_version. cmp ( & parsed_version) {
24
- Ordering :: Less => -1i32 ,
25
- Ordering :: Equal => 0i32 ,
26
- Ordering :: Greater => 1i32 ,
27
- } ;
28
- Ok ( cmp_result. abi_encode ( ) )
10
+ foundry_version_cmp ( version) . map ( |cmp| ( cmp as i8 ) . abi_encode ( ) )
29
11
}
30
12
}
31
13
32
14
impl Cheatcode for foundryVersionAtLeastCall {
33
15
fn apply ( & self , _state : & mut Cheatcodes ) -> Result {
34
16
let Self { version } = self ;
17
+ foundry_version_cmp ( version) . map ( |cmp| cmp. is_ge ( ) . abi_encode ( ) )
18
+ }
19
+ }
35
20
36
- if version. contains ( "+" ) || version. contains ( "-" ) {
37
- return Err ( fmt_err ! ( "Version must be in only major.minor.patch format" ) ) ;
38
- }
39
-
40
- let parsed_version =
41
- Version :: parse ( version) . map_err ( |_| fmt_err ! ( "Invalid version format" ) ) ?;
42
- let current_semver = Version :: parse ( SEMVER_VERSION )
43
- . map_err ( |_| fmt_err ! ( "Invalid current version format" ) ) ?;
21
+ fn foundry_version_cmp ( version : & str ) -> Result < Ordering > {
22
+ version_cmp ( SEMVER_VERSION . split ( '-' ) . next ( ) . unwrap ( ) , version)
23
+ }
44
24
45
- let current_version =
46
- Version :: new ( current_semver. major , current_semver. minor , current_semver. patch ) ;
25
+ fn version_cmp ( version_a : & str , version_b : & str ) -> Result < Ordering > {
26
+ let version_a = parse_version ( version_a) ?;
27
+ let version_b = parse_version ( version_b) ?;
28
+ Ok ( version_a. cmp ( & version_b) )
29
+ }
47
30
48
- let at_least = current_version. cmp ( & parsed_version) != Ordering :: Less ;
49
- Ok ( at_least. abi_encode ( ) )
31
+ fn parse_version ( version : & str ) -> Result < Version > {
32
+ let version =
33
+ Version :: parse ( version) . map_err ( |e| fmt_err ! ( "invalid version `{version}`: {e}" ) ) ?;
34
+ if !version. pre . is_empty ( ) {
35
+ return Err ( fmt_err ! ( "invalid version `{version}`: pre-release versions are not supported" ) ) ;
36
+ }
37
+ if !version. build . is_empty ( ) {
38
+ return Err ( fmt_err ! ( "invalid version `{version}`: build metadata is not supported" ) ) ;
50
39
}
40
+ Ok ( version)
51
41
}
0 commit comments