diff options
Diffstat (limited to 'third_party/rust/matches')
-rw-r--r-- | third_party/rust/matches/.cargo-checksum.json | 1 | ||||
-rw-r--r-- | third_party/rust/matches/Cargo.toml | 23 | ||||
-rw-r--r-- | third_party/rust/matches/LICENSE | 25 | ||||
-rw-r--r-- | third_party/rust/matches/README.md | 7 | ||||
-rw-r--r-- | third_party/rust/matches/lib.rs | 161 | ||||
-rw-r--r-- | third_party/rust/matches/tests/macro_use_one.rs | 11 | ||||
-rw-r--r-- | third_party/rust/matches/tests/use_star.rs | 10 |
7 files changed, 238 insertions, 0 deletions
diff --git a/third_party/rust/matches/.cargo-checksum.json b/third_party/rust/matches/.cargo-checksum.json new file mode 100644 index 0000000000..27136fb6e3 --- /dev/null +++ b/third_party/rust/matches/.cargo-checksum.json @@ -0,0 +1 @@ +{"files":{"Cargo.toml":"31b6fb9ee5ecddc429d13300336509fd7d199aa316375c00b581d60533b8ed43","LICENSE":"d7b49708075b5f43f8e108464f1970c8c66fa8b6afce4f9c944da3af77cc1460","README.md":"096bf8a54bac9e0fe42720d12aa40a2d3a6e78293c1bd8895f6bd9350a7fc224","lib.rs":"c6d14b7899277e45ac5f46d95f87c91ed0e5118db3b377e0914799d0e252650a","tests/macro_use_one.rs":"4f599fae16f1aef369050bf0ad74cbefec06c430b29e0c9ab0811ac9592e997a","tests/use_star.rs":"39a23b8002544f65e7a896e2cefe8e0af7404151fa65d327e748f5c1101badf8"},"package":"2532096657941c2fea9c289d370a250971c689d4f143798ff67113ec042024a5"}
\ No newline at end of file diff --git a/third_party/rust/matches/Cargo.toml b/third_party/rust/matches/Cargo.toml new file mode 100644 index 0000000000..12206e91a4 --- /dev/null +++ b/third_party/rust/matches/Cargo.toml @@ -0,0 +1,23 @@ +# THIS FILE IS AUTOMATICALLY GENERATED BY CARGO +# +# When uploading crates to the registry Cargo will automatically +# "normalize" Cargo.toml files for maximal compatibility +# with all versions of Cargo and also rewrite `path` dependencies +# to registry (e.g., crates.io) dependencies. +# +# If you are reading this file be aware that the original Cargo.toml +# will likely look very different (and much more reasonable). +# See Cargo.toml.orig for the original contents. + +[package] +name = "matches" +version = "0.1.10" +description = "A macro to evaluate, as a boolean, whether an expression matches a pattern." +documentation = "https://docs.rs/matches/" +readme = "README.md" +license = "MIT" +repository = "https://github.com/SimonSapin/rust-std-candidates" + +[lib] +name = "matches" +path = "lib.rs" diff --git a/third_party/rust/matches/LICENSE b/third_party/rust/matches/LICENSE new file mode 100644 index 0000000000..a7b759a49c --- /dev/null +++ b/third_party/rust/matches/LICENSE @@ -0,0 +1,25 @@ +Copyright (c) 2014-2016 Simon Sapin + +Permission is hereby granted, free of charge, to any +person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the +Software without restriction, including without +limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software +is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice +shall be included in all copies or substantial portions +of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF +ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR +IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. diff --git a/third_party/rust/matches/README.md b/third_party/rust/matches/README.md new file mode 100644 index 0000000000..543ba1b091 --- /dev/null +++ b/third_party/rust/matches/README.md @@ -0,0 +1,7 @@ +A macro to evaluate, as a boolean, whether an expression matches a pattern. + +For users who build using only Rust 1.42 and newer, consider using [`std::matches`], which +is included in the [standard library prelude] and thus is automatically in scope. + +[`std::matches`]: core::matches +[standard library prelude]: https://doc.rust-lang.org/stable/reference/names/preludes.html diff --git a/third_party/rust/matches/lib.rs b/third_party/rust/matches/lib.rs new file mode 100644 index 0000000000..262f8d0764 --- /dev/null +++ b/third_party/rust/matches/lib.rs @@ -0,0 +1,161 @@ +#![no_std] +//! A macro to evaluate, as a boolean, whether an expression matches a pattern. +//! +//! For users who build using only Rust 1.42 and newer, consider using [`std::matches`], which +//! is included in the [standard library prelude] and thus is automatically in scope. +//! +//! [`std::matches`]: core::matches +//! [standard library prelude]: https://doc.rust-lang.org/stable/reference/names/preludes.html +//! +//! # Examples +//! +//! ``` +//! #[macro_use] +//! extern crate matches; +//! +//! #[derive(Debug)] +//! pub enum Foo<T> { +//! A, +//! B(T), +//! } +//! +//! impl<T> Foo<T> { +//! pub fn is_b(&self) -> bool { +//! matches!(*self, Foo::B(_)) +//! } +//! } +//! +//! impl<T: core::fmt::Debug> Foo<T> { +//! pub fn assert_is_b(&self) { +//! assert_matches!(&self, Foo::B(_)); +//! } +//! } +//! # fn main() { } +//! ``` + +/// Check if an expression matches a refutable pattern. +/// +/// Syntax: `matches!(` *expression* `,` *pattern* `)` +/// +/// Return a boolean, true if the expression matches the pattern, false otherwise. +/// +/// # Examples +/// +/// ``` +/// #[macro_use] +/// extern crate matches; +/// +/// pub enum Foo<T> { +/// A, +/// B(T), +/// } +/// +/// impl<T> Foo<T> { +/// pub fn is_a(&self) -> bool { +/// matches!(*self, Foo::A) +/// } +/// +/// pub fn is_b(&self) -> bool { +/// matches!(*self, Foo::B(_)) +/// } +/// } +/// +/// # fn main() { } +/// ``` +#[macro_export] +macro_rules! matches { + ($expression:expr, $($pattern:tt)+) => { + match $expression { + $($pattern)+ => true, + _ => false + } + } +} + +/// Assert that an expression matches a refutable pattern. +/// +/// Syntax: `assert_matches!(` *expression* `,` *pattern* `)` +/// +/// Panic with a message that shows the expression if it does not match the +/// pattern. +/// +/// # Examples +/// +/// ``` +/// #[macro_use] +/// extern crate matches; +/// +/// fn main() { +/// let data = [1, 2, 3]; +/// assert_matches!(data.get(1), Some(_)); +/// } +/// ``` +#[macro_export] +macro_rules! assert_matches { + ($expression:expr, $($pattern:tt)+) => { + match $expression { + $($pattern)+ => (), + ref e => panic!("assertion failed: `{:?}` does not match `{}`", e, stringify!($($pattern)+)), + } + } +} + +/// Assert that an expression matches a refutable pattern using debug assertions. +/// +/// Syntax: `debug_assert_matches!(` *expression* `,` *pattern* `)` +/// +/// If debug assertions are enabled, panic with a message that shows the +/// expression if it does not match the pattern. +/// +/// When debug assertions are not enabled, this macro does nothing. +/// +/// # Examples +/// +/// ``` +/// #[macro_use] +/// extern crate matches; +/// +/// fn main() { +/// let data = [1, 2, 3]; +/// debug_assert_matches!(data.get(1), Some(_)); +/// } +/// ``` +#[macro_export] +macro_rules! debug_assert_matches { + ($expression:expr, $($pattern:tt)+) => { + if cfg!(debug_assertions) { + match $expression { + $($pattern)+ => (), + ref e => panic!("assertion failed: `{:?}` does not match `{}`", e, stringify!($($pattern)+)), + } + } + } +} + +#[test] +fn matches_works() { + let foo = Some("-12"); + assert!(matches!(foo, Some(bar) if + matches!(bar.as_bytes()[0], b'+' | b'-') && + matches!(bar.as_bytes()[1], b'0'...b'9') + )); +} + +#[test] +fn assert_matches_works() { + let foo = Some("-12"); + assert_matches!(foo, Some(bar) if + matches!(bar.as_bytes()[0], b'+' | b'-') && + matches!(bar.as_bytes()[1], b'0'...b'9') + ); +} + +#[test] +#[should_panic(expected = "assertion failed: `Some(\"-AB\")` does not match ")] +fn assert_matches_panics() { + let foo = Some("-AB"); + assert_matches!(foo, Some(bar) if + matches!(bar.as_bytes()[0], b'+' | b'-') && + matches!(bar.as_bytes()[1], b'0'...b'9') + ); +} diff --git a/third_party/rust/matches/tests/macro_use_one.rs b/third_party/rust/matches/tests/macro_use_one.rs new file mode 100644 index 0000000000..a527a89ce7 --- /dev/null +++ b/third_party/rust/matches/tests/macro_use_one.rs @@ -0,0 +1,11 @@ +// https://github.com/SimonSapin/rust-std-candidates/issues/12 +#[macro_use(matches)] extern crate matches; + +#[test] +fn matches_works() { + let foo = Some("-12"); + assert!(matches!(foo, Some(bar) if + matches!(bar.as_bytes()[0], b'+' | b'-') && + matches!(bar.as_bytes()[1], b'0'...b'9') + )); +} diff --git a/third_party/rust/matches/tests/use_star.rs b/third_party/rust/matches/tests/use_star.rs new file mode 100644 index 0000000000..58a670b93e --- /dev/null +++ b/third_party/rust/matches/tests/use_star.rs @@ -0,0 +1,10 @@ +//! https://github.com/SimonSapin/rust-std-candidates/issues/22 + +extern crate matches; + +use matches::*; + +#[test] +fn test_assert_matches() { + assert_matches!(4, 4) +} |