diff options
| author | Eric Kidd <git@randomhacks.net> | 2014-12-13 13:33:18 -0500 |
|---|---|---|
| committer | Eric Kidd <git@randomhacks.net> | 2014-12-14 08:56:51 -0500 |
| commit | c2b0d7dd8818a0dca9b1fa7af6873375907f05ca (patch) | |
| tree | 369f80679f73646e73ed5f58b2041eb8183aa242 /src/compiletest/errors.rs | |
| parent | 444fa1b7cffcd99ca5b8abb51acf979f06a25899 (diff) | |
| download | rust-c2b0d7dd8818a0dca9b1fa7af6873375907f05ca.tar.gz rust-c2b0d7dd8818a0dca9b1fa7af6873375907f05ca.zip | |
Modify `regex::Captures::{at,name}` to return `Option`
Closes #14602. As discussed in that issue, the existing `at` and `name`
functions represent two different results with the empty string:
1. Matched the empty string.
2. Did not match anything.
Consider the following example. This regex has two named matched
groups, `key` and `value`. `value` is optional:
```rust
// Matches "foo", "foo;v=bar" and "foo;v=".
regex!(r"(?P<key>[a-z]+)(;v=(?P<value>[a-z]*))?");
```
We can access `value` using `caps.name("value")`, but there's no way for
us to distinguish between the `"foo"` and `"foo;v="` cases.
Early this year, @BurntSushi recommended modifying the existing `at` and
`name` functions to return `Option`, instead of adding new functions to
the API.
This is a [breaking-change], but the fix is easy:
- `refs.at(1)` becomes `refs.at(1).unwrap_or("")`.
- `refs.name(name)` becomes `refs.name(name).unwrap_or("")`.
Diffstat (limited to 'src/compiletest/errors.rs')
| -rw-r--r-- | src/compiletest/errors.rs | 8 |
1 files changed, 4 insertions, 4 deletions
diff --git a/src/compiletest/errors.rs b/src/compiletest/errors.rs index f15db7d9371..b7df43aabdd 100644 --- a/src/compiletest/errors.rs +++ b/src/compiletest/errors.rs @@ -66,10 +66,10 @@ fn parse_expected(last_nonfollow_error: Option<uint>, line: &str, re: &Regex) -> Option<(WhichLine, ExpectedError)> { re.captures(line).and_then(|caps| { - let adjusts = caps.name("adjusts").len(); - let kind = caps.name("kind").to_ascii_lower(); - let msg = caps.name("msg").trim().to_string(); - let follow = caps.name("follow").len() > 0; + let adjusts = caps.name("adjusts").unwrap_or("").len(); + let kind = caps.name("kind").unwrap_or("").to_ascii_lower(); + let msg = caps.name("msg").unwrap_or("").trim().to_string(); + let follow = caps.name("follow").unwrap_or("").len() > 0; let (which, line) = if follow { assert!(adjusts == 0, "use either //~| or //~^, not both."); |
