| macro_rules! define_uuid_macro { |
| {$(#[$doc:meta])*} => { |
| $(#[$doc])* |
| #[cfg(feature = "macro-diagnostics")] |
| #[macro_export] |
| macro_rules! uuid { |
| ($uuid:literal) => {{ |
| $crate::Uuid::from_bytes($crate::uuid_macro_internal::parse_lit!($uuid)) |
| }}; |
| } |
| |
| $(#[$doc])* |
| #[cfg(not(feature = "macro-diagnostics"))] |
| #[macro_export] |
| macro_rules! uuid { |
| ($uuid:literal) => {{ |
| const OUTPUT: $crate::Uuid = match $crate::Uuid::try_parse($uuid) { |
| Ok(u) => u, |
| Err(_) => { |
| // here triggers const_err |
| // const_panic requires 1.57 |
| #[allow(unconditional_panic)] |
| let _ = ["invalid uuid representation"][1]; |
| |
| loop {} // -> never type |
| } |
| }; |
| OUTPUT |
| }}; |
| } |
| } |
| } |
| |
| define_uuid_macro! { |
| /// Parse [`Uuid`][uuid::Uuid]s from string literals at compile time. |
| /// |
| /// ## Usage |
| /// |
| /// This macro transforms the string literal representation of a |
| /// [`Uuid`][uuid::Uuid] into the bytes representation, raising a compilation |
| /// error if it cannot properly be parsed. |
| /// |
| /// ## Examples |
| /// |
| /// Setting a global constant: |
| /// |
| /// ``` |
| /// # use uuid::{uuid, Uuid}; |
| /// pub const SCHEMA_ATTR_CLASS: Uuid = uuid!("00000000-0000-0000-0000-ffff00000000"); |
| /// pub const SCHEMA_ATTR_UUID: Uuid = uuid!("00000000-0000-0000-0000-ffff00000001"); |
| /// pub const SCHEMA_ATTR_NAME: Uuid = uuid!("00000000-0000-0000-0000-ffff00000002"); |
| /// ``` |
| /// |
| /// Defining a local variable: |
| /// |
| /// ``` |
| /// # use uuid::uuid; |
| /// let uuid = uuid!("urn:uuid:F9168C5E-CEB2-4faa-B6BF-329BF39FA1E4"); |
| /// ``` |
| /// |
| /// ## Compilation Failures |
| /// |
| /// Invalid UUIDs are rejected: |
| /// |
| /// ```compile_fail |
| /// # use uuid::uuid; |
| /// let uuid = uuid!("F9168C5E-ZEB2-4FAA-B6BF-329BF39FA1E4"); |
| /// ``` |
| /// |
| /// Enable the feature `macro-diagnostics` to see the error messages below. |
| /// |
| /// Provides the following compilation error: |
| /// |
| /// ```txt |
| /// error: invalid character: expected an optional prefix of `urn:uuid:` followed by [0-9a-fA-F-], found Z at 9 |
| /// | |
| /// | let id = uuid!("F9168C5E-ZEB2-4FAA-B6BF-329BF39FA1E4"); |
| /// | ^ |
| /// ``` |
| /// |
| /// Tokens that aren't string literals are also rejected: |
| /// |
| /// ```compile_fail |
| /// # use uuid::uuid; |
| /// let uuid_str: &str = "550e8400e29b41d4a716446655440000"; |
| /// let uuid = uuid!(uuid_str); |
| /// ``` |
| /// |
| /// Provides the following compilation error: |
| /// |
| /// ```txt |
| /// error: expected string literal |
| /// | |
| /// | let uuid = uuid!(uuid_str); |
| /// | ^^^^^^^^ |
| /// ``` |
| /// |
| /// [uuid::Uuid]: https://docs.rs/uuid/*/uuid/struct.Uuid.html |
| } |