@@ -83,9 +83,6 @@ impl std::str::FromStr for PartialVersion {
83
83
type Err = PartialVersionError ;
84
84
85
85
fn from_str ( value : & str ) -> Result < Self , Self :: Err > {
86
- if is_req ( value) {
87
- return Err ( ErrorKind :: VersionReq . into ( ) ) ;
88
- }
89
86
match semver:: Version :: parse ( value) {
90
87
Ok ( ver) => Ok ( ver. into ( ) ) ,
91
88
Err ( _) => {
@@ -96,9 +93,16 @@ impl std::str::FromStr for PartialVersion {
96
93
Err ( _) if value. contains ( '+' ) => return Err ( ErrorKind :: BuildMetadata . into ( ) ) ,
97
94
Err ( _) => return Err ( ErrorKind :: Unexpected . into ( ) ) ,
98
95
} ;
99
- assert_eq ! ( version_req. comparators. len( ) , 1 , "guaranteed by is_req" ) ;
96
+ if version_req. comparators . len ( ) != 1 {
97
+ return Err ( ErrorKind :: VersionReq . into ( ) ) ;
98
+ }
100
99
let comp = version_req. comparators . pop ( ) . unwrap ( ) ;
101
- assert_eq ! ( comp. op, semver:: Op :: Caret , "guaranteed by is_req" ) ;
100
+ if comp. op != semver:: Op :: Caret {
101
+ return Err ( ErrorKind :: VersionReq . into ( ) ) ;
102
+ } else if value. starts_with ( '^' ) {
103
+ // Can't distinguish between `^` present or not
104
+ return Err ( ErrorKind :: VersionReq . into ( ) ) ;
105
+ }
102
106
let pre = if comp. pre . is_empty ( ) {
103
107
None
104
108
} else {
@@ -179,17 +183,6 @@ enum ErrorKind {
179
183
Unexpected ,
180
184
}
181
185
182
- fn is_req ( value : & str ) -> bool {
183
- let Some ( first) = value. chars ( ) . next ( ) else {
184
- return false ;
185
- } ;
186
- "<>=^~" . contains ( first)
187
- || value. contains ( '*' )
188
- || value. contains ( ',' )
189
- || value. contains ( 'x' )
190
- || value. contains ( 'X' )
191
- }
192
-
193
186
#[ cfg( test) ]
194
187
mod test {
195
188
use super :: * ;
@@ -200,6 +193,8 @@ mod test {
200
193
let cases = & [
201
194
// Valid pre-release
202
195
( "1.43.0-beta.1" , str![ "1.43.0-beta.1" ] ) ,
196
+ // Valid pre-release with wildcard
197
+ ( "1.43.0-beta.1.x" , str![ "1.43.0-beta.1.x" ] ) ,
203
198
] ;
204
199
for ( input, expected) in cases {
205
200
let actual: Result < PartialVersion , _ > = input. parse ( ) ;
0 commit comments