Skip to content

Commit de43012

Browse files
authored
Merge pull request #247 from dtolnay/x
Parse x and X as wildcard
2 parents 97fa1aa + 4358bd0 commit de43012

File tree

2 files changed

+27
-39
lines changed

2 files changed

+27
-39
lines changed

src/parse.rs

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ impl FromStr for VersionReq {
8282

8383
fn from_str(text: &str) -> Result<Self, Self::Err> {
8484
let text = text.trim_start_matches(' ');
85-
if let Some(text) = text.strip_prefix('*') {
85+
if let Some(text) = wildcard(text) {
8686
if text.trim_start_matches(' ').is_empty() {
8787
#[cfg(not(no_const_vec_new))]
8888
return Ok(VersionReq::STAR);
@@ -181,6 +181,18 @@ fn numeric_identifier(input: &str, pos: Position) -> Result<(u64, &str), Error>
181181
}
182182
}
183183

184+
fn wildcard(input: &str) -> Option<&str> {
185+
if let Some(rest) = input.strip_prefix('*') {
186+
Some(rest)
187+
} else if let Some(rest) = input.strip_prefix('x') {
188+
Some(rest)
189+
} else if let Some(rest) = input.strip_prefix('X') {
190+
Some(rest)
191+
} else {
192+
None
193+
}
194+
}
195+
184196
fn dot(input: &str, pos: Position) -> Result<&str, Error> {
185197
if let Some(rest) = input.strip_prefix('.') {
186198
Ok(rest)
@@ -281,7 +293,7 @@ fn comparator(input: &str) -> Result<(Comparator, Position, &str), Error> {
281293

282294
let (minor, text) = if let Some(text) = text.strip_prefix('.') {
283295
pos = Position::Minor;
284-
if let Some(text) = text.strip_prefix('*') {
296+
if let Some(text) = wildcard(text) {
285297
has_wildcard = true;
286298
if default_op {
287299
op = Op::Wildcard;
@@ -297,7 +309,7 @@ fn comparator(input: &str) -> Result<(Comparator, Position, &str), Error> {
297309

298310
let (patch, text) = if let Some(text) = text.strip_prefix('.') {
299311
pos = Position::Patch;
300-
if let Some(text) = text.strip_prefix('*') {
312+
if let Some(text) = wildcard(text) {
301313
if default_op {
302314
op = Op::Wildcard;
303315
}

tests/test_version_req.rs

Lines changed: 12 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -264,51 +264,27 @@ pub fn test_wildcard() {
264264

265265
let ref r = req("*");
266266
assert_match_all(r, &["0.9.1", "2.9.0", "0.0.9", "1.0.1", "1.1.1"]);
267-
assert_match_none(r, &[]);
267+
assert_match_none(r, &["1.0.0-pre"]);
268268

269-
let err = req_err("x");
270-
assert_to_string(
271-
err,
272-
"unexpected character 'x' while parsing major version number",
273-
);
274-
275-
let err = req_err("X");
276-
assert_to_string(
277-
err,
278-
"unexpected character 'X' while parsing major version number",
279-
);
269+
for s in &["x", "X"] {
270+
assert_eq!(*r, req(s));
271+
}
280272

281273
let ref r = req("1.*");
282274
assert_match_all(r, &["1.2.0", "1.2.1", "1.1.1", "1.3.0"]);
283-
assert_match_none(r, &["0.0.9"]);
284-
285-
let err = req_err("1.x");
286-
assert_to_string(
287-
err,
288-
"unexpected character 'x' while parsing minor version number",
289-
);
275+
assert_match_none(r, &["0.0.9", "1.2.0-pre"]);
290276

291-
let err = req_err("1.X");
292-
assert_to_string(
293-
err,
294-
"unexpected character 'X' while parsing minor version number",
295-
);
277+
for s in &["1.x", "1.X", "1.*.*"] {
278+
assert_eq!(*r, req(s));
279+
}
296280

297281
let ref r = req("1.2.*");
298282
assert_match_all(r, &["1.2.0", "1.2.2", "1.2.4"]);
299-
assert_match_none(r, &["1.9.0", "1.0.9", "2.0.1", "0.1.3"]);
300-
301-
let err = req_err("1.2.x");
302-
assert_to_string(
303-
err,
304-
"unexpected character 'x' while parsing patch version number",
305-
);
283+
assert_match_none(r, &["1.9.0", "1.0.9", "2.0.1", "0.1.3", "1.2.2-pre"]);
306284

307-
let err = req_err("1.2.X");
308-
assert_to_string(
309-
err,
310-
"unexpected character 'X' while parsing patch version number",
311-
);
285+
for s in &["1.2.x", "1.2.X"] {
286+
assert_eq!(*r, req(s));
287+
}
312288
}
313289

314290
#[test]

0 commit comments

Comments
 (0)