summaryrefslogtreecommitdiffstats
path: root/vendor/strum/src/lib.rs
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/strum/src/lib.rs')
-rw-r--r--vendor/strum/src/lib.rs232
1 files changed, 232 insertions, 0 deletions
diff --git a/vendor/strum/src/lib.rs b/vendor/strum/src/lib.rs
new file mode 100644
index 000000000..2711912cb
--- /dev/null
+++ b/vendor/strum/src/lib.rs
@@ -0,0 +1,232 @@
+//! # Strum
+//!
+//! [![Build Status](https://travis-ci.org/Peternator7/strum.svg?branch=master)](https://travis-ci.org/Peternator7/strum)
+//! [![Latest Version](https://img.shields.io/crates/v/strum.svg)](https://crates.io/crates/strum)
+//! [![Rust Documentation](https://docs.rs/strum/badge.svg)](https://docs.rs/strum)
+//!
+//! Strum is a set of macros and traits for working with
+//! enums and strings easier in Rust.
+//!
+//! The full version of the README can be found on [Github](https://github.com/Peternator7/strum).
+//!
+//! # Including Strum in Your Project
+//!
+//! Import strum and `strum_macros` into your project by adding the following lines to your
+//! Cargo.toml. `strum_macros` contains the macros needed to derive all the traits in Strum.
+//!
+//! ```toml
+//! [dependencies]
+//! strum = "0.24"
+//! strum_macros = "0.24"
+//!
+//! # You can also access strum_macros exports directly through strum using the "derive" feature
+//! strum = { version = "0.24", features = ["derive"] }
+//! ```
+//!
+
+#![cfg_attr(not(feature = "std"), no_std)]
+#![cfg_attr(docsrs, feature(doc_cfg))]
+
+// only for documentation purposes
+pub mod additional_attributes;
+
+#[cfg(feature = "phf")]
+#[doc(hidden)]
+pub use phf as _private_phf_reexport_for_macro_if_phf_feature;
+
+/// The `ParseError` enum is a collection of all the possible reasons
+/// an enum can fail to parse from a string.
+#[derive(Debug, Clone, Copy, Eq, PartialEq, Hash)]
+pub enum ParseError {
+ VariantNotFound,
+}
+
+#[cfg(feature = "std")]
+impl std::fmt::Display for ParseError {
+ fn fmt(&self, f: &mut std::fmt::Formatter) -> Result<(), std::fmt::Error> {
+ // We could use our macro here, but this way we don't take a dependency on the
+ // macros crate.
+ match self {
+ ParseError::VariantNotFound => write!(f, "Matching variant not found"),
+ }
+ }
+}
+
+#[cfg(feature = "std")]
+impl std::error::Error for ParseError {
+ fn description(&self) -> &str {
+ match self {
+ ParseError::VariantNotFound => {
+ "Unable to find a variant of the given enum matching the string given. Matching \
+ can be extended with the Serialize attribute and is case sensitive."
+ }
+ }
+ }
+}
+
+/// This trait designates that an `Enum` can be iterated over. It can
+/// be auto generated using `strum_macros` on your behalf.
+///
+/// # Example
+///
+/// ```rust
+/// # use std::fmt::Debug;
+/// // You need to bring the type into scope to use it!!!
+/// use strum::{EnumIter, IntoEnumIterator};
+///
+/// #[derive(EnumIter, Debug)]
+/// enum Color {
+/// Red,
+/// Green { range: usize },
+/// Blue(usize),
+/// Yellow,
+/// }
+///
+/// // Iterate over the items in an enum and perform some function on them.
+/// fn generic_iterator<E, F>(pred: F)
+/// where
+/// E: IntoEnumIterator,
+/// F: Fn(E),
+/// {
+/// for e in E::iter() {
+/// pred(e)
+/// }
+/// }
+///
+/// generic_iterator::<Color, _>(|color| println!("{:?}", color));
+/// ```
+pub trait IntoEnumIterator: Sized {
+ type Iterator: Iterator<Item = Self>;
+
+ fn iter() -> Self::Iterator;
+}
+
+/// Associates additional pieces of information with an Enum. This can be
+/// autoimplemented by deriving `EnumMessage` and annotating your variants with
+/// `#[strum(message="...")]`.
+///
+/// # Example
+///
+/// ```rust
+/// # use std::fmt::Debug;
+/// // You need to bring the type into scope to use it!!!
+/// use strum::EnumMessage;
+///
+/// #[derive(PartialEq, Eq, Debug, EnumMessage)]
+/// enum Pet {
+/// #[strum(message="I have a dog")]
+/// #[strum(detailed_message="My dog's name is Spots")]
+/// Dog,
+/// /// I am documented.
+/// #[strum(message="I don't have a cat")]
+/// Cat,
+/// }
+///
+/// let my_pet = Pet::Dog;
+/// assert_eq!("I have a dog", my_pet.get_message().unwrap());
+/// ```
+pub trait EnumMessage {
+ fn get_message(&self) -> Option<&'static str>;
+ fn get_detailed_message(&self) -> Option<&'static str>;
+
+ /// Get the doc comment associated with a variant if it exists.
+ fn get_documentation(&self) -> Option<&'static str>;
+ fn get_serializations(&self) -> &'static [&'static str];
+}
+
+/// `EnumProperty` is a trait that makes it possible to store additional information
+/// with enum variants. This trait is designed to be used with the macro of the same
+/// name in the `strum_macros` crate. Currently, the only string literals are supported
+/// in attributes, the other methods will be implemented as additional attribute types
+/// become stabilized.
+///
+/// # Example
+///
+/// ```rust
+/// # use std::fmt::Debug;
+/// // You need to bring the type into scope to use it!!!
+/// use strum::EnumProperty;
+///
+/// #[derive(PartialEq, Eq, Debug, EnumProperty)]
+/// enum Class {
+/// #[strum(props(Teacher="Ms.Frizzle", Room="201"))]
+/// History,
+/// #[strum(props(Teacher="Mr.Smith"))]
+/// #[strum(props(Room="103"))]
+/// Mathematics,
+/// #[strum(props(Time="2:30"))]
+/// Science,
+/// }
+///
+/// let history = Class::History;
+/// assert_eq!("Ms.Frizzle", history.get_str("Teacher").unwrap());
+/// ```
+pub trait EnumProperty {
+ fn get_str(&self, prop: &str) -> Option<&'static str>;
+ fn get_int(&self, _prop: &str) -> Option<usize> {
+ Option::None
+ }
+
+ fn get_bool(&self, _prop: &str) -> Option<bool> {
+ Option::None
+ }
+}
+
+/// A cheap reference-to-reference conversion. Used to convert a value to a
+/// reference value with `'static` lifetime within generic code.
+#[deprecated(
+ since = "0.22.0",
+ note = "please use `#[derive(IntoStaticStr)]` instead"
+)]
+pub trait AsStaticRef<T>
+where
+ T: ?Sized,
+{
+ fn as_static(&self) -> &'static T;
+}
+
+/// A trait for capturing the number of variants in Enum. This trait can be autoderived by
+/// `strum_macros`.
+pub trait EnumCount {
+ const COUNT: usize;
+}
+
+/// A trait for retrieving the names of each variant in Enum. This trait can
+/// be autoderived by `strum_macros`.
+pub trait VariantNames {
+ /// Names of the variants of this enum
+ const VARIANTS: &'static [&'static str];
+}
+
+#[cfg(feature = "derive")]
+pub use strum_macros::*;
+
+macro_rules! DocumentMacroRexports {
+ ($($export:ident),+) => {
+ $(
+ #[cfg(all(docsrs, feature = "derive"))]
+ #[cfg_attr(docsrs, doc(cfg(feature = "derive")))]
+ pub use strum_macros::$export;
+ )+
+ };
+}
+
+// We actually only re-export these items individually if we're building
+// for docsrs. You can do a weird thing where you rename the macro
+// and then reference it through strum. The renaming feature should be deprecated now that
+// 2018 edition is almost 2 years old, but we'll need to give people some time to do that.
+DocumentMacroRexports! {
+ AsRefStr,
+ AsStaticStr,
+ Display,
+ EnumCount,
+ EnumDiscriminants,
+ EnumIter,
+ EnumMessage,
+ EnumProperty,
+ EnumString,
+ EnumVariantNames,
+ FromRepr,
+ IntoStaticStr,
+ ToString
+}