uuid/macros.rs
1macro_rules! define_uuid_macro {
2 {$(#[$doc:meta])*} => {
3 $(#[$doc])*
4 #[cfg(feature = "macro-diagnostics")]
5 #[macro_export]
6 macro_rules! uuid {
7 ($uuid:expr) => {{
8 const OUTPUT: $crate::Uuid = match $crate::Uuid::try_parse($uuid) {
9 $crate::__macro_support::Ok(u) => u,
10 $crate::__macro_support::Err(_) => panic!("invalid UUID"),
11 };
12 OUTPUT
13 }};
14 ($uuid:literal) => {{
15 $crate::Uuid::from_bytes($crate::uuid_macro_internal::parse_lit!($uuid))
16 }};
17 }
18
19 $(#[$doc])*
20 #[cfg(not(feature = "macro-diagnostics"))]
21 #[macro_export]
22 macro_rules! uuid {
23 ($uuid:expr) => {{
24 const OUTPUT: $crate::Uuid = match $crate::Uuid::try_parse($uuid) {
25 $crate::__macro_support::Ok(u) => u,
26 $crate::__macro_support::Err(_) => panic!("invalid UUID"),
27 };
28 OUTPUT
29 }};
30 }
31 }
32}
33
34define_uuid_macro! {
35/// Parse [`Uuid`][uuid::Uuid]s from string literals at compile time.
36///
37/// ## Usage
38///
39/// This macro transforms the string literal representation of a
40/// [`Uuid`][uuid::Uuid] into the bytes representation, raising a compilation
41/// error if it cannot properly be parsed.
42///
43/// ## Examples
44///
45/// Setting a global constant:
46///
47/// ```
48/// # use uuid::{uuid, Uuid};
49/// pub const SCHEMA_ATTR_CLASS: Uuid = uuid!("00000000-0000-0000-0000-ffff00000000");
50/// pub const SCHEMA_ATTR_UUID: Uuid = uuid!("00000000-0000-0000-0000-ffff00000001");
51/// pub const SCHEMA_ATTR_NAME: Uuid = uuid!("00000000-0000-0000-0000-ffff00000002");
52/// ```
53///
54/// Defining a local variable:
55///
56/// ```
57/// # use uuid::uuid;
58/// let uuid = uuid!("urn:uuid:F9168C5E-CEB2-4faa-B6BF-329BF39FA1E4");
59/// ```
60/// Using a const variable:
61/// ```
62/// # use uuid::uuid;
63/// const UUID_STR: &str = "12345678-1234-5678-1234-567812345678";
64/// let UUID = uuid!(UUID_STR);
65/// ```
66///
67/// ## Compilation Failures
68///
69/// Invalid UUIDs are rejected:
70///
71/// ```compile_fail
72/// # use uuid::uuid;
73/// let uuid = uuid!("F9168C5E-ZEB2-4FAA-B6BF-329BF39FA1E4");
74/// ```
75///
76/// Enable the feature `macro-diagnostics` to see the error messages below.
77///
78/// Provides the following compilation error:
79///
80/// ```txt
81/// error: invalid character: expected an optional prefix of `urn:uuid:` followed by [0-9a-fA-F-], found Z at 9
82/// |
83/// | let id = uuid!("F9168C5E-ZEB2-4FAA-B6BF-329BF39FA1E4");
84/// | ^
85/// ```
86///
87/// [uuid::Uuid]: https://docs.rs/uuid/*/uuid/struct.Uuid.html
88}