diff --git a/Cargo.toml b/Cargo.toml index c6298a5..a0c1f3e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -56,7 +56,8 @@ status = "actively-developed" [features] default = ["std"] std = ["wasm-bindgen?/std", "js-sys?/std"] -macro-diagnostics = ["dep:uuid-macro-internal"] +# Deprecated; now a no-op +macro-diagnostics = [] # NOTE: When adding new features, check the `ci.yml` workflow # and include them where necessary (you can follow along with existing features) @@ -160,12 +161,6 @@ default-features = false optional = true version = "1" -# Public: Re-exported -[dependencies.uuid-macro-internal] -version = "1.19.0" -path = "macros" -optional = true - # Private [dependencies.atomic] default-features = false @@ -185,9 +180,6 @@ default-features = false version = "0.3" optional = true -[dev-dependencies.bincode] -version = "1.0" - [dev-dependencies.serde] version = "1.0.221" @@ -214,7 +206,6 @@ version = "1" [workspace] members = [ - "macros", "rng", "examples", "tests/smoke-test", diff --git a/examples/src/uuid_macro.rs b/examples/src/uuid_macro.rs index f2a49a8..ffa9b2a 100644 --- a/examples/src/uuid_macro.rs +++ b/examples/src/uuid_macro.rs @@ -3,9 +3,6 @@ //! `uuid!` will parse encoded UUIDs at compile time instead of at runtime. //! If you've got a fixed UUID string handy then consider using `uuid!` instead //! of `Uuid::parse_str` or `str::parse`. -//! -//! If you enable the `macro-diagnostics` feature, you can see much better -//! error messages. fn main() { use uuid::uuid; diff --git a/macros/COPYRIGHT b/macros/COPYRIGHT deleted file mode 100644 index 488e533..0000000 --- a/macros/COPYRIGHT +++ /dev/null @@ -1,7 +0,0 @@ -The Uuid Project is copyright 2021, The Uuid Developers. - -Licensed under the Apache License, Version 2.0 or the MIT License , at your option. All files in the project -carrying such notice may not be copied, modified, or distributed except -according to those terms. diff --git a/macros/Cargo.toml b/macros/Cargo.toml deleted file mode 100644 index d542e30..0000000 --- a/macros/Cargo.toml +++ /dev/null @@ -1,30 +0,0 @@ -[package] -name = "uuid-macro-internal" -version = "1.19.0" -edition = "2021" -authors = [ - "QnnOkabayashi" -] -categories = [ - "data-structures", - "no-std", - "parser-implementations", - "wasm" -] -description = "Private implementation details of the uuid! macro." -documentation = "https://docs.rs/uuid" -repository = "https://github.com/uuid-rs/uuid" -license = "Apache-2.0 OR MIT" - -[lib] -proc-macro = true - -[dependencies.syn] -version = "2.0.5" - -[dependencies.quote] -version = "1.0.10" - -[dependencies.proc-macro2] -version = "1.0.29" -features = ["span-locations"] diff --git a/macros/LICENSE-APACHE b/macros/LICENSE-APACHE deleted file mode 100644 index 16fe87b..0000000 --- a/macros/LICENSE-APACHE +++ /dev/null @@ -1,201 +0,0 @@ - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - -TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - -1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - -2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - -3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - -4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - -5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - -6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - -7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - -8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - -9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - -END OF TERMS AND CONDITIONS - -APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - -Copyright [yyyy] [name of copyright owner] - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. diff --git a/macros/LICENSE-MIT b/macros/LICENSE-MIT deleted file mode 100644 index 267a89a..0000000 --- a/macros/LICENSE-MIT +++ /dev/null @@ -1,25 +0,0 @@ -Copyright (c) 2021 The Uuid Developers - -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/macros/src/error.rs b/macros/src/error.rs deleted file mode 100644 index db20861..0000000 --- a/macros/src/error.rs +++ /dev/null @@ -1,144 +0,0 @@ -use std::fmt; - -/// A general error that can occur when working with UUIDs. -#[derive(Clone, Debug, Eq, Hash, PartialEq)] -pub struct Error(pub(crate) ErrorKind); - -#[derive(Clone, Debug, Eq, Hash, PartialEq)] -pub(crate) enum ErrorKind { - /// Invalid character in the [`Uuid`] string. - /// - /// [`Uuid`]: ../struct.Uuid.html - Char { character: char, index: usize }, - /// A simple [`Uuid`] didn't contain 32 characters. - /// - /// [`Uuid`]: ../struct.Uuid.html - SimpleLength { len: usize }, - /// A hyphenated [`Uuid`] didn't contain 5 groups - /// - /// [`Uuid`]: ../struct.Uuid.html - GroupCount { count: usize }, - /// A hyphenated [`Uuid`] had a group that wasn't the right length - /// - /// [`Uuid`]: ../struct.Uuid.html - GroupLength { - group: usize, - len: usize, - index: usize, - }, -} - -/// A string that is guaranteed to fail to parse to a [`Uuid`]. -/// -/// This type acts as a lightweight error indicator, suggesting -/// that the string cannot be parsed but offering no error -/// details. To get details, use `InvalidUuid::into_err`. -/// -/// [`Uuid`]: ../struct.Uuid.html -#[derive(Clone, Debug, Eq, Hash, PartialEq)] -pub struct InvalidUuid<'a>(pub(crate) &'a str); - -impl<'a> InvalidUuid<'a> { - /// Converts the lightweight error type into detailed diagnostics. - pub fn into_err(self) -> Error { - let (s, offset, simple) = match self.0.as_bytes() { - [b'{', s @ .., b'}'] => (s, 1, false), - [b'u', b'r', b'n', b':', b'u', b'u', b'i', b'd', b':', s @ ..] => { - (s, "urn:uuid:".len(), false) - } - s => (s, 0, true), - }; - - let mut hyphen_count = 0; - let mut group_bounds = [0; 4]; - - // SAFETY: the byte array came from a valid utf8 string, - // and is aligned along char boundries. - let string = unsafe { std::str::from_utf8_unchecked(s) }; - - for (index, character) in string.char_indices() { - let byte = character as u8; - if character as u32 - byte as u32 > 0 { - // Multibyte char - return Error(ErrorKind::Char { - character, - index: index + offset + 1, - }); - } else if byte == b'-' { - // While we search, also count group breaks - if hyphen_count < 4 { - group_bounds[hyphen_count] = index; - } - hyphen_count += 1; - } else if !byte.is_ascii_hexdigit() { - // Non-hex char - return Error(ErrorKind::Char { - character: byte as char, - index: index + offset + 1, - }); - } - } - - if hyphen_count == 0 && simple { - // This means that we tried and failed to parse a simple uuid. - // Since we verified that all the characters are valid, this means - // that it MUST have an invalid length. - Error(ErrorKind::SimpleLength { len: s.len() }) - } else if hyphen_count != 4 { - // We tried to parse a hyphenated variant, but there weren't - // 5 groups (4 hyphen splits). - Error(ErrorKind::GroupCount { - count: hyphen_count + 1, - }) - } else { - // There are 5 groups, one of them has an incorrect length - const BLOCK_STARTS: [usize; 5] = [0, 9, 14, 19, 24]; - for i in 0..4 { - if group_bounds[i] != BLOCK_STARTS[i + 1] - 1 { - return Error(ErrorKind::GroupLength { - group: i, - len: group_bounds[i] - BLOCK_STARTS[i], - index: offset + BLOCK_STARTS[i] + 1, - }); - } - } - - // The last group must be too long - Error(ErrorKind::GroupLength { - group: 4, - len: s.len() - BLOCK_STARTS[4], - index: offset + BLOCK_STARTS[4] + 1, - }) - } - } -} - -impl fmt::Display for Error { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - match self.0 { - ErrorKind::Char { - character, index, .. - } => { - write!(f, "invalid character: expected an optional prefix of `urn:uuid:` followed by [0-9a-zA-Z], found `{}` at {}", character, index) - } - ErrorKind::SimpleLength { len } => { - write!( - f, - "invalid length: expected length 32 for simple format, found {}", - len - ) - } - ErrorKind::GroupCount { count } => { - write!(f, "invalid group count: expected 5, found {}", count) - } - ErrorKind::GroupLength { group, len, .. } => { - let expected = [8, 4, 4, 4, 12][group]; - write!( - f, - "invalid group length in group {}: expected {}, found {}", - group, expected, len - ) - } - } - } -} diff --git a/macros/src/lib.rs b/macros/src/lib.rs deleted file mode 100644 index e1d517b..0000000 --- a/macros/src/lib.rs +++ /dev/null @@ -1,84 +0,0 @@ -//! Implementation details for the `uuid!` macro. -//! -//! This crate is not meant to be used directly. Instead, -//! you can use the `macro-diagnostics` feature of `uuid`: -//! -//! ```toml -//! [dependencies.uuid] -//! features = ["macro-diagnostics"] -//! ``` - -use proc_macro::TokenStream; -use proc_macro2::TokenStream as TokenStream2; -use quote::{quote, quote_spanned}; -use std::fmt; -use syn::{spanned::Spanned, LitStr}; - -mod error; -mod parser; - -#[proc_macro] -#[doc(hidden)] -pub fn parse_lit(input: TokenStream) -> TokenStream { - build_uuid(input.clone()).unwrap_or_else(|e| { - let msg = e.to_string(); - let span = match e { - Error::UuidParse(lit, error::Error(error::ErrorKind::Char { character, index })) => { - let mut bytes = character as u32; - let mut width = 0; - while bytes != 0 { - bytes >>= 4; - width += 1; - } - let mut s = proc_macro2::Literal::string(""); - s.set_span(lit.span()); - s.subspan(index..index + width - 1) - } - Error::UuidParse( - lit, - error::Error(error::ErrorKind::GroupLength { index, len, .. }), - ) => { - let mut s = proc_macro2::Literal::string(""); - s.set_span(lit.span()); - s.subspan(index..index + len) - } - _ => None, - } - .unwrap_or_else(|| TokenStream2::from(input).span()); - - TokenStream::from(quote_spanned! {span=> - compile_error!(#msg) - }) - }) -} - -enum Error { - NonStringLiteral, - UuidParse(LitStr, error::Error), -} - -impl fmt::Display for Error { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - match *self { - Error::NonStringLiteral => f.write_str("expected string literal"), - Error::UuidParse(_, ref e) => write!(f, "{}", e), - } - } -} - -fn build_uuid(input: TokenStream) -> Result { - let str_lit = match syn::parse::(input) { - Ok(syn::Lit::Str(literal)) => literal, - _ => return Err(Error::NonStringLiteral), - }; - - let bytes = - parser::try_parse(&str_lit.value()).map_err(|e| Error::UuidParse(str_lit, e.into_err()))?; - - let tokens = bytes - .iter() - .map(|byte| quote! { #byte, }) - .collect::(); - - Ok(quote! {[#tokens]}.into()) -} diff --git a/macros/src/parser.rs b/macros/src/parser.rs deleted file mode 100644 index 0c40e01..0000000 --- a/macros/src/parser.rs +++ /dev/null @@ -1,152 +0,0 @@ -// Copyright 2013-2014 The Rust Project Developers. -// Copyright 2018 The Uuid Project Developers. -// -// See the COPYRIGHT file at the top-level directory of this distribution. -// -// Licensed under the Apache License, Version 2.0 or the MIT license -// , at your -// option. This file may not be copied, modified, or distributed -// except according to those terms. - -use crate::error::InvalidUuid; - -#[inline] -pub const fn try_parse(input: &'_ str) -> Result<[u8; 16], InvalidUuid<'_>> { - let result = match (input.len(), input.as_bytes()) { - // Inputs of 32 bytes must be a non-hyphenated UUID - (32, s) => parse_simple(s), - // Hyphenated UUIDs may be wrapped in various ways: - // - `{UUID}` for braced UUIDs - // - `urn:uuid:UUID` for URNs - // - `UUID` for a regular hyphenated UUID - (36, s) - | (38, [b'{', s @ .., b'}']) - | (45, [b'u', b'r', b'n', b':', b'u', b'u', b'i', b'd', b':', s @ ..]) => { - parse_hyphenated(s) - } - // Any other shaped input is immediately invalid - _ => Err(()), - }; - - match result { - Ok(b) => Ok(b), - Err(()) => Err(InvalidUuid(input)), - } -} - -#[inline] -const fn parse_simple(s: &[u8]) -> Result<[u8; 16], ()> { - // This length check here removes all other bounds - // checks in this function - if s.len() != 32 { - return Err(()); - } - - let mut buf: [u8; 16] = [0; 16]; - let mut i = 0; - - while i < 16 { - // Convert a two-char hex value (like `A8`) - // into a byte (like `10101000`) - let h1 = HEX_TABLE[s[i * 2] as usize]; - let h2 = HEX_TABLE[s[i * 2 + 1] as usize]; - - // We use `0xff` as a sentinel value to indicate - // an invalid hex character sequence (like the letter `G`) - if h1 | h2 == 0xff { - return Err(()); - } - - // The upper nibble needs to be shifted into position - // to produce the final byte value - buf[i] = SHL4_TABLE[h1 as usize] | h2; - i += 1; - } - - Ok(buf) -} - -#[inline] -const fn parse_hyphenated(s: &[u8]) -> Result<[u8; 16], ()> { - // This length check here removes all other bounds - // checks in this function - if s.len() != 36 { - return Err(()); - } - - // We look at two hex-encoded values (4 chars) at a time because - // that's the size of the smallest group in a hyphenated UUID. - // The indexes we're interested in are: - // - // uuid : 936da01f-9abd-4d9d-80c7-02af85c822a8 - // | | || || || || | | - // hyphens : | | 8| 13| 18| 23| | | - // positions: 0 4 9 14 19 24 28 32 - - // First, ensure the hyphens appear in the right places - match [s[8], s[13], s[18], s[23]] { - [b'-', b'-', b'-', b'-'] => {} - _ => return Err(()), - } - - let positions: [u8; 8] = [0, 4, 9, 14, 19, 24, 28, 32]; - let mut buf: [u8; 16] = [0; 16]; - let mut j = 0; - - while j < 8 { - let i = positions[j]; - - // The decoding here is the same as the simple case - // We're just dealing with two values instead of one - let h1 = HEX_TABLE[s[i as usize] as usize]; - let h2 = HEX_TABLE[s[(i + 1) as usize] as usize]; - let h3 = HEX_TABLE[s[(i + 2) as usize] as usize]; - let h4 = HEX_TABLE[s[(i + 3) as usize] as usize]; - - if h1 | h2 | h3 | h4 == 0xff { - return Err(()); - } - - buf[j * 2] = SHL4_TABLE[h1 as usize] | h2; - buf[j * 2 + 1] = SHL4_TABLE[h3 as usize] | h4; - j += 1; - } - - Ok(buf) -} - -const HEX_TABLE: &[u8; 256] = &{ - let mut buf = [0; 256]; - let mut i: u8 = 0; - - loop { - buf[i as usize] = match i { - b'0'..=b'9' => i - b'0', - b'a'..=b'f' => i - b'a' + 10, - b'A'..=b'F' => i - b'A' + 10, - _ => 0xff, - }; - - if i == 255 { - break buf; - } - - i += 1 - } -}; - -const SHL4_TABLE: &[u8; 256] = &{ - let mut buf = [0; 256]; - let mut i: u8 = 0; - - loop { - buf[i as usize] = i.wrapping_shl(4); - - if i == 255 { - break buf; - } - - i += 1; - } -}; diff --git a/src/builder.rs b/src/builder.rs index 8afbacb..80ce43e 100644 --- a/src/builder.rs +++ b/src/builder.rs @@ -367,7 +367,8 @@ impl Uuid { /// Creates a UUID using the supplied bytes in little endian order. /// - /// The individual fields encoded in the buffer will be flipped. + /// Note that ordering is applied to each _field_, rather than to the bytes as a whole. + /// This ordering is compatible with Microsoft's mixed endian GUID format. /// /// # Examples /// diff --git a/src/lib.rs b/src/lib.rs index e9d3c0c..2c9c287 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -99,7 +99,6 @@ //! //! Other crate features can also be useful beyond the version support: //! -//! * `macro-diagnostics` - enhances the diagnostics of `uuid!` macro. //! * `serde` - adds the ability to serialize and deserialize a UUID using //! `serde`. //! * `borsh` - adds the ability to serialize and deserialize a UUID using @@ -270,10 +269,6 @@ mod sha1; mod external; -#[doc(hidden)] -#[cfg(feature = "macro-diagnostics")] -pub extern crate uuid_macro_internal; - #[doc(hidden)] pub mod __macro_support { pub use crate::std::result::Result::{Err, Ok}; @@ -813,10 +808,13 @@ impl Uuid { /// Returns the bytes of the UUID in little-endian order. /// - /// The bytes will be flipped to convert into little-endian order. This is - /// based on the endianness of the UUID, rather than the target environment + /// The bytes for each field will be flipped to convert into little-endian order. + /// This is based on the endianness of the UUID, rather than the target environment /// so bytes will be flipped on both big and little endian machines. /// + /// Note that ordering is applied to each _field_, rather than to the bytes as a whole. + /// This ordering is compatible with Microsoft's mixed endian GUID format. + /// /// # Examples /// /// ``` diff --git a/src/macros.rs b/src/macros.rs index 235863c..0c2fa5b 100644 --- a/src/macros.rs +++ b/src/macros.rs @@ -1,37 +1,3 @@ -macro_rules! define_uuid_macro { - {$(#[$doc:meta])*} => { - $(#[$doc])* - #[cfg(feature = "macro-diagnostics")] - #[macro_export] - macro_rules! uuid { - ($uuid:expr) => {{ - const OUTPUT: $crate::Uuid = match $crate::Uuid::try_parse($uuid) { - $crate::__macro_support::Ok(u) => u, - $crate::__macro_support::Err(_) => panic!("invalid UUID"), - }; - OUTPUT - }}; - ($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:expr) => {{ - const OUTPUT: $crate::Uuid = match $crate::Uuid::try_parse($uuid) { - $crate::__macro_support::Ok(u) => u, - $crate::__macro_support::Err(_) => panic!("invalid UUID"), - }; - OUTPUT - }}; - } - } -} - -define_uuid_macro! { /// Parse [`Uuid`][uuid::Uuid]s from string literals at compile time. /// /// ## Usage @@ -64,27 +30,16 @@ define_uuid_macro! { /// let UUID = uuid!(UUID_STR); /// ``` /// -/// ## 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"); -/// | ^ -/// ``` -/// /// [uuid::Uuid]: https://docs.rs/uuid/*/uuid/struct.Uuid.html +#[macro_export] +macro_rules! uuid { + ($uuid:expr) => {{ + const OUTPUT: $crate::Uuid = match $crate::Uuid::try_parse($uuid) { + $crate::__macro_support::Ok(u) => u, + $crate::__macro_support::Err(_) => panic!("invalid UUID"), + }; + OUTPUT + }}; } // Internal macros diff --git a/src/non_nil.rs b/src/non_nil.rs index dcf2793..8bbc686 100644 --- a/src/non_nil.rs +++ b/src/non_nil.rs @@ -32,7 +32,7 @@ use crate::{ /// may change. It is currently only guaranteed that `NonNilUuid` and `Option` /// are the same size as `Uuid`. #[repr(transparent)] -#[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)] +#[derive(Copy, Clone, PartialEq, Eq, Hash, PartialOrd, Ord)] pub struct NonNilUuid(NonZeroU128); impl fmt::Debug for NonNilUuid { diff --git a/tests/macros.rs b/tests/macros.rs index c7cf2a4..2a8edd0 100644 --- a/tests/macros.rs +++ b/tests/macros.rs @@ -1,4 +1,3 @@ -#[cfg(feature = "macro-diagnostics")] #[test] fn ui() { let t = trybuild::TestCases::new(); diff --git a/tests/ui/compile_fail/invalid_parse.stderr b/tests/ui/compile_fail/invalid_parse.stderr index b630494..b3b596b 100644 --- a/tests/ui/compile_fail/invalid_parse.stderr +++ b/tests/ui/compile_fail/invalid_parse.stderr @@ -1,197 +1,479 @@ -error: invalid length: expected length 32 for simple format, found 0 +error[E0080]: evaluation panicked: invalid UUID + --> tests/ui/compile_fail/invalid_parse.rs:3:17 + | +3 | const _: Uuid = uuid!(""); + | ^^^^^^^^^ evaluation of `_::OUTPUT` failed here + | + = note: this error originates in the macro `$crate::panic::panic_2021` which comes from the expansion of the macro `uuid` (in Nightly builds, run with -Z macro-backtrace for more info) + +note: erroneous constant encountered --> tests/ui/compile_fail/invalid_parse.rs:3:17 | 3 | const _: Uuid = uuid!(""); | ^^^^^^^^^ | - = note: this error originates in the macro `uuid` (in Nightly builds, run with -Z macro-backtrace for more info) + = note: this note originates in the macro `uuid` (in Nightly builds, run with -Z macro-backtrace for more info) -error: invalid character: expected an optional prefix of `urn:uuid:` followed by [0-9a-zA-Z], found `!` at 1 - --> tests/ui/compile_fail/invalid_parse.rs:4:24 +error[E0080]: evaluation panicked: invalid UUID + --> tests/ui/compile_fail/invalid_parse.rs:4:17 | 4 | const _: Uuid = uuid!("!"); - | ^ + | ^^^^^^^^^^ evaluation of `_::OUTPUT` failed here + | + = note: this error originates in the macro `$crate::panic::panic_2021` which comes from the expansion of the macro `uuid` (in Nightly builds, run with -Z macro-backtrace for more info) -error: invalid group length in group 4: expected 12, found 13 - --> tests/ui/compile_fail/invalid_parse.rs:5:48 +note: erroneous constant encountered + --> tests/ui/compile_fail/invalid_parse.rs:4:17 + | +4 | const _: Uuid = uuid!("!"); + | ^^^^^^^^^^ + | + = note: this note originates in the macro `uuid` (in Nightly builds, run with -Z macro-backtrace for more info) + +error[E0080]: evaluation panicked: invalid UUID + --> tests/ui/compile_fail/invalid_parse.rs:5:17 | 5 | const _: Uuid = uuid!("F9168C5E-CEB2-4faa-B6BF-329BF39FA1E45"); - | ^^^^^^^^^^^^^ + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ evaluation of `_::OUTPUT` failed here + | + = note: this error originates in the macro `$crate::panic::panic_2021` which comes from the expansion of the macro `uuid` (in Nightly builds, run with -Z macro-backtrace for more info) -error: invalid group length in group 3: expected 4, found 3 - --> tests/ui/compile_fail/invalid_parse.rs:6:43 +note: erroneous constant encountered + --> tests/ui/compile_fail/invalid_parse.rs:5:17 + | +5 | const _: Uuid = uuid!("F9168C5E-CEB2-4faa-B6BF-329BF39FA1E45"); + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | + = note: this note originates in the macro `uuid` (in Nightly builds, run with -Z macro-backtrace for more info) + +error[E0080]: evaluation panicked: invalid UUID + --> tests/ui/compile_fail/invalid_parse.rs:6:17 | 6 | const _: Uuid = uuid!("F9168C5E-CEB2-4faa-BBF-329BF39FA1E4"); - | ^^^ + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ evaluation of `_::OUTPUT` failed here + | + = note: this error originates in the macro `$crate::panic::panic_2021` which comes from the expansion of the macro `uuid` (in Nightly builds, run with -Z macro-backtrace for more info) -error: invalid character: expected an optional prefix of `urn:uuid:` followed by [0-9a-zA-Z], found `G` at 21 - --> tests/ui/compile_fail/invalid_parse.rs:7:44 +note: erroneous constant encountered + --> tests/ui/compile_fail/invalid_parse.rs:6:17 + | +6 | const _: Uuid = uuid!("F9168C5E-CEB2-4faa-BBF-329BF39FA1E4"); + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | + = note: this note originates in the macro `uuid` (in Nightly builds, run with -Z macro-backtrace for more info) + +error[E0080]: evaluation panicked: invalid UUID + --> tests/ui/compile_fail/invalid_parse.rs:7:17 | 7 | const _: Uuid = uuid!("F9168C5E-CEB2-4faa-BGBF-329BF39FA1E4"); - | ^ + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ evaluation of `_::OUTPUT` failed here + | + = note: this error originates in the macro `$crate::panic::panic_2021` which comes from the expansion of the macro `uuid` (in Nightly builds, run with -Z macro-backtrace for more info) -error: invalid group count: expected 5, found 4 +note: erroneous constant encountered + --> tests/ui/compile_fail/invalid_parse.rs:7:17 + | +7 | const _: Uuid = uuid!("F9168C5E-CEB2-4faa-BGBF-329BF39FA1E4"); + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | + = note: this note originates in the macro `uuid` (in Nightly builds, run with -Z macro-backtrace for more info) + +error[E0080]: evaluation panicked: invalid UUID + --> tests/ui/compile_fail/invalid_parse.rs:8:17 + | +8 | const _: Uuid = uuid!("F9168C5E-CEB2-4faa-B6BFF329BF39FA1E4"); + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ evaluation of `_::OUTPUT` failed here + | + = note: this error originates in the macro `$crate::panic::panic_2021` which comes from the expansion of the macro `uuid` (in Nightly builds, run with -Z macro-backtrace for more info) + +note: erroneous constant encountered --> tests/ui/compile_fail/invalid_parse.rs:8:17 | 8 | const _: Uuid = uuid!("F9168C5E-CEB2-4faa-B6BFF329BF39FA1E4"); | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | - = note: this error originates in the macro `uuid` (in Nightly builds, run with -Z macro-backtrace for more info) + = note: this note originates in the macro `uuid` (in Nightly builds, run with -Z macro-backtrace for more info) -error: invalid group count: expected 5, found 3 +error[E0080]: evaluation panicked: invalid UUID + --> tests/ui/compile_fail/invalid_parse.rs:9:17 + | +9 | const _: Uuid = uuid!("F9168C5E-CEB2-4faa"); + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ evaluation of `_::OUTPUT` failed here + | + = note: this error originates in the macro `$crate::panic::panic_2021` which comes from the expansion of the macro `uuid` (in Nightly builds, run with -Z macro-backtrace for more info) + +note: erroneous constant encountered --> tests/ui/compile_fail/invalid_parse.rs:9:17 | 9 | const _: Uuid = uuid!("F9168C5E-CEB2-4faa"); | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ | - = note: this error originates in the macro `uuid` (in Nightly builds, run with -Z macro-backtrace for more info) + = note: this note originates in the macro `uuid` (in Nightly builds, run with -Z macro-backtrace for more info) -error: invalid character: expected an optional prefix of `urn:uuid:` followed by [0-9a-zA-Z], found `X` at 19 - --> tests/ui/compile_fail/invalid_parse.rs:10:42 +error[E0080]: evaluation panicked: invalid UUID + --> tests/ui/compile_fail/invalid_parse.rs:10:17 | 10 | const _: Uuid = uuid!("F9168C5E-CEB2-4faaXB6BFF329BF39FA1E4"); - | ^ + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ evaluation of `_::OUTPUT` failed here + | + = note: this error originates in the macro `$crate::panic::panic_2021` which comes from the expansion of the macro `uuid` (in Nightly builds, run with -Z macro-backtrace for more info) -error: invalid group length in group 1: expected 4, found 3 - --> tests/ui/compile_fail/invalid_parse.rs:11:33 +note: erroneous constant encountered + --> tests/ui/compile_fail/invalid_parse.rs:10:17 + | +10 | const _: Uuid = uuid!("F9168C5E-CEB2-4faaXB6BFF329BF39FA1E4"); + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | + = note: this note originates in the macro `uuid` (in Nightly builds, run with -Z macro-backtrace for more info) + +error[E0080]: evaluation panicked: invalid UUID + --> tests/ui/compile_fail/invalid_parse.rs:11:17 | 11 | const _: Uuid = uuid!("F9168C5E-CEB-24fa-eB6BFF32-BF39FA1E4"); - | ^^^ + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ evaluation of `_::OUTPUT` failed here + | + = note: this error originates in the macro `$crate::panic::panic_2021` which comes from the expansion of the macro `uuid` (in Nightly builds, run with -Z macro-backtrace for more info) -error: invalid group length in group 4: expected 12, found 8 - --> tests/ui/compile_fail/invalid_parse.rs:12:48 +note: erroneous constant encountered + --> tests/ui/compile_fail/invalid_parse.rs:11:17 + | +11 | const _: Uuid = uuid!("F9168C5E-CEB-24fa-eB6BFF32-BF39FA1E4"); + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | + = note: this note originates in the macro `uuid` (in Nightly builds, run with -Z macro-backtrace for more info) + +error[E0080]: evaluation panicked: invalid UUID + --> tests/ui/compile_fail/invalid_parse.rs:12:17 | 12 | const _: Uuid = uuid!("01020304-1112-2122-3132-41424344"); - | ^^^^^^^^ + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ evaluation of `_::OUTPUT` failed here + | + = note: this error originates in the macro `$crate::panic::panic_2021` which comes from the expansion of the macro `uuid` (in Nightly builds, run with -Z macro-backtrace for more info) -error: invalid length: expected length 32 for simple format, found 33 +note: erroneous constant encountered + --> tests/ui/compile_fail/invalid_parse.rs:12:17 + | +12 | const _: Uuid = uuid!("01020304-1112-2122-3132-41424344"); + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | + = note: this note originates in the macro `uuid` (in Nightly builds, run with -Z macro-backtrace for more info) + +error[E0080]: evaluation panicked: invalid UUID + --> tests/ui/compile_fail/invalid_parse.rs:13:17 + | +13 | const _: Uuid = uuid!("67e5504410b1426f9247bb680e5fe0c88"); + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ evaluation of `_::OUTPUT` failed here + | + = note: this error originates in the macro `$crate::panic::panic_2021` which comes from the expansion of the macro `uuid` (in Nightly builds, run with -Z macro-backtrace for more info) + +note: erroneous constant encountered --> tests/ui/compile_fail/invalid_parse.rs:13:17 | 13 | const _: Uuid = uuid!("67e5504410b1426f9247bb680e5fe0c88"); | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | - = note: this error originates in the macro `uuid` (in Nightly builds, run with -Z macro-backtrace for more info) + = note: this note originates in the macro `uuid` (in Nightly builds, run with -Z macro-backtrace for more info) -error: invalid character: expected an optional prefix of `urn:uuid:` followed by [0-9a-zA-Z], found `g` at 32 - --> tests/ui/compile_fail/invalid_parse.rs:14:55 +error[E0080]: evaluation panicked: invalid UUID + --> tests/ui/compile_fail/invalid_parse.rs:14:17 | 14 | const _: Uuid = uuid!("67e5504410b1426f9247bb680e5fe0cg8"); - | ^ + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ evaluation of `_::OUTPUT` failed here + | + = note: this error originates in the macro `$crate::panic::panic_2021` which comes from the expansion of the macro `uuid` (in Nightly builds, run with -Z macro-backtrace for more info) -error: invalid length: expected length 32 for simple format, found 31 +note: erroneous constant encountered + --> tests/ui/compile_fail/invalid_parse.rs:14:17 + | +14 | const _: Uuid = uuid!("67e5504410b1426f9247bb680e5fe0cg8"); + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | + = note: this note originates in the macro `uuid` (in Nightly builds, run with -Z macro-backtrace for more info) + +error[E0080]: evaluation panicked: invalid UUID + --> tests/ui/compile_fail/invalid_parse.rs:18:17 + | +18 | const _: Uuid = uuid!("67e5504410b1426f9247bb680e5fe0c"); + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ evaluation of `_::OUTPUT` failed here + | + = note: this error originates in the macro `$crate::panic::panic_2021` which comes from the expansion of the macro `uuid` (in Nightly builds, run with -Z macro-backtrace for more info) + +note: erroneous constant encountered --> tests/ui/compile_fail/invalid_parse.rs:18:17 | 18 | const _: Uuid = uuid!("67e5504410b1426f9247bb680e5fe0c"); | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | - = note: this error originates in the macro `uuid` (in Nightly builds, run with -Z macro-backtrace for more info) + = note: this note originates in the macro `uuid` (in Nightly builds, run with -Z macro-backtrace for more info) -error: invalid character: expected an optional prefix of `urn:uuid:` followed by [0-9a-zA-Z], found `X` at 7 - --> tests/ui/compile_fail/invalid_parse.rs:19:30 +error[E0080]: evaluation panicked: invalid UUID + --> tests/ui/compile_fail/invalid_parse.rs:19:17 | 19 | const _: Uuid = uuid!("67e550X410b1426f9247bb680e5fe0cd"); - | ^ + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ evaluation of `_::OUTPUT` failed here + | + = note: this error originates in the macro `$crate::panic::panic_2021` which comes from the expansion of the macro `uuid` (in Nightly builds, run with -Z macro-backtrace for more info) -error: invalid group count: expected 5, found 2 +note: erroneous constant encountered + --> tests/ui/compile_fail/invalid_parse.rs:19:17 + | +19 | const _: Uuid = uuid!("67e550X410b1426f9247bb680e5fe0cd"); + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | + = note: this note originates in the macro `uuid` (in Nightly builds, run with -Z macro-backtrace for more info) + +error[E0080]: evaluation panicked: invalid UUID + --> tests/ui/compile_fail/invalid_parse.rs:20:17 + | +20 | const _: Uuid = uuid!("67e550-4105b1426f9247bb680e5fe0c"); + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ evaluation of `_::OUTPUT` failed here + | + = note: this error originates in the macro `$crate::panic::panic_2021` which comes from the expansion of the macro `uuid` (in Nightly builds, run with -Z macro-backtrace for more info) + +note: erroneous constant encountered --> tests/ui/compile_fail/invalid_parse.rs:20:17 | 20 | const _: Uuid = uuid!("67e550-4105b1426f9247bb680e5fe0c"); | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | - = note: this error originates in the macro `uuid` (in Nightly builds, run with -Z macro-backtrace for more info) + = note: this note originates in the macro `uuid` (in Nightly builds, run with -Z macro-backtrace for more info) -error: invalid group length in group 3: expected 4, found 5 - --> tests/ui/compile_fail/invalid_parse.rs:21:43 +error[E0080]: evaluation panicked: invalid UUID + --> tests/ui/compile_fail/invalid_parse.rs:21:17 | 21 | const _: Uuid = uuid!("F9168C5E-CEB2-4faa-B6BF1-02BF39FA1E4"); - | ^^^^^ + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ evaluation of `_::OUTPUT` failed here + | + = note: this error originates in the macro `$crate::panic::panic_2021` which comes from the expansion of the macro `uuid` (in Nightly builds, run with -Z macro-backtrace for more info) -error: invalid group length in group 3: expected 4, found 3 - --> tests/ui/compile_fail/invalid_parse.rs:24:43 +note: erroneous constant encountered + --> tests/ui/compile_fail/invalid_parse.rs:21:17 + | +21 | const _: Uuid = uuid!("F9168C5E-CEB2-4faa-B6BF1-02BF39FA1E4"); + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | + = note: this note originates in the macro `uuid` (in Nightly builds, run with -Z macro-backtrace for more info) + +error[E0080]: evaluation panicked: invalid UUID + --> tests/ui/compile_fail/invalid_parse.rs:24:17 | 24 | const _: Uuid = uuid!("F9168C5E-CEB2-4faa-BBF-329BF39FA1E4"); - | ^^^ + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ evaluation of `_::OUTPUT` failed here + | + = note: this error originates in the macro `$crate::panic::panic_2021` which comes from the expansion of the macro `uuid` (in Nightly builds, run with -Z macro-backtrace for more info) -error: invalid character: expected an optional prefix of `urn:uuid:` followed by [0-9a-zA-Z], found `G` at 21 - --> tests/ui/compile_fail/invalid_parse.rs:25:44 +note: erroneous constant encountered + --> tests/ui/compile_fail/invalid_parse.rs:24:17 + | +24 | const _: Uuid = uuid!("F9168C5E-CEB2-4faa-BBF-329BF39FA1E4"); + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | + = note: this note originates in the macro `uuid` (in Nightly builds, run with -Z macro-backtrace for more info) + +error[E0080]: evaluation panicked: invalid UUID + --> tests/ui/compile_fail/invalid_parse.rs:25:17 | 25 | const _: Uuid = uuid!("F9168C5E-CEB2-4faa-BGBF-329BF39FA1E4"); - | ^ + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ evaluation of `_::OUTPUT` failed here + | + = note: this error originates in the macro `$crate::panic::panic_2021` which comes from the expansion of the macro `uuid` (in Nightly builds, run with -Z macro-backtrace for more info) -error: invalid group length in group 4: expected 12, found 8 - --> tests/ui/compile_fail/invalid_parse.rs:26:48 +note: erroneous constant encountered + --> tests/ui/compile_fail/invalid_parse.rs:25:17 + | +25 | const _: Uuid = uuid!("F9168C5E-CEB2-4faa-BGBF-329BF39FA1E4"); + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | + = note: this note originates in the macro `uuid` (in Nightly builds, run with -Z macro-backtrace for more info) + +error[E0080]: evaluation panicked: invalid UUID + --> tests/ui/compile_fail/invalid_parse.rs:26:17 | 26 | const _: Uuid = uuid!("01020304-1112-2122-3132-41424344"); - | ^^^^^^^^ + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ evaluation of `_::OUTPUT` failed here + | + = note: this error originates in the macro `$crate::panic::panic_2021` which comes from the expansion of the macro `uuid` (in Nightly builds, run with -Z macro-backtrace for more info) -error: invalid group count: expected 5, found 4 +note: erroneous constant encountered + --> tests/ui/compile_fail/invalid_parse.rs:26:17 + | +26 | const _: Uuid = uuid!("01020304-1112-2122-3132-41424344"); + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | + = note: this note originates in the macro `uuid` (in Nightly builds, run with -Z macro-backtrace for more info) + +error[E0080]: evaluation panicked: invalid UUID + --> tests/ui/compile_fail/invalid_parse.rs:27:17 + | +27 | const _: Uuid = uuid!("F9168C5E-CEB2-4faa-B6BFF329BF39FA1E4"); + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ evaluation of `_::OUTPUT` failed here + | + = note: this error originates in the macro `$crate::panic::panic_2021` which comes from the expansion of the macro `uuid` (in Nightly builds, run with -Z macro-backtrace for more info) + +note: erroneous constant encountered --> tests/ui/compile_fail/invalid_parse.rs:27:17 | 27 | const _: Uuid = uuid!("F9168C5E-CEB2-4faa-B6BFF329BF39FA1E4"); | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | - = note: this error originates in the macro `uuid` (in Nightly builds, run with -Z macro-backtrace for more info) + = note: this note originates in the macro `uuid` (in Nightly builds, run with -Z macro-backtrace for more info) -error: invalid character: expected an optional prefix of `urn:uuid:` followed by [0-9a-zA-Z], found `G` at 30 - --> tests/ui/compile_fail/invalid_parse.rs:28:53 +error[E0080]: evaluation panicked: invalid UUID + --> tests/ui/compile_fail/invalid_parse.rs:28:17 | 28 | const _: Uuid = uuid!("urn:uuid:F9168C5E-CEB2-4faa-BGBF-329BF39FA1E4"); - | ^ + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ evaluation of `_::OUTPUT` failed here + | + = note: this error originates in the macro `$crate::panic::panic_2021` which comes from the expansion of the macro `uuid` (in Nightly builds, run with -Z macro-backtrace for more info) -error: invalid group length in group 3: expected 4, found 5 - --> tests/ui/compile_fail/invalid_parse.rs:29:52 +note: erroneous constant encountered + --> tests/ui/compile_fail/invalid_parse.rs:28:17 + | +28 | const _: Uuid = uuid!("urn:uuid:F9168C5E-CEB2-4faa-BGBF-329BF39FA1E4"); + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | + = note: this note originates in the macro `uuid` (in Nightly builds, run with -Z macro-backtrace for more info) + +error[E0080]: evaluation panicked: invalid UUID + --> tests/ui/compile_fail/invalid_parse.rs:29:17 | 29 | const _: Uuid = uuid!("urn:uuid:F9168C5E-CEB2-4faa-B2cBF-32BF39FA1E4"); - | ^^^^^ + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ evaluation of `_::OUTPUT` failed here + | + = note: this error originates in the macro `$crate::panic::panic_2021` which comes from the expansion of the macro `uuid` (in Nightly builds, run with -Z macro-backtrace for more info) -error: invalid group length in group 3: expected 4, found 5 - --> tests/ui/compile_fail/invalid_parse.rs:30:44 +note: erroneous constant encountered + --> tests/ui/compile_fail/invalid_parse.rs:29:17 + | +29 | const _: Uuid = uuid!("urn:uuid:F9168C5E-CEB2-4faa-B2cBF-32BF39FA1E4"); + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | + = note: this note originates in the macro `uuid` (in Nightly builds, run with -Z macro-backtrace for more info) + +error[E0080]: evaluation panicked: invalid UUID + --> tests/ui/compile_fail/invalid_parse.rs:30:17 | 30 | const _: Uuid = uuid!("{F9168C5E-CEB2-4faa-B0a75-32BF39FA1E4}"); - | ^^^^^ + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ evaluation of `_::OUTPUT` failed here + | + = note: this error originates in the macro `$crate::panic::panic_2021` which comes from the expansion of the macro `uuid` (in Nightly builds, run with -Z macro-backtrace for more info) -error: invalid character: expected an optional prefix of `urn:uuid:` followed by [0-9a-zA-Z], found `z` at 30 - --> tests/ui/compile_fail/invalid_parse.rs:32:53 +note: erroneous constant encountered + --> tests/ui/compile_fail/invalid_parse.rs:30:17 + | +30 | const _: Uuid = uuid!("{F9168C5E-CEB2-4faa-B0a75-32BF39FA1E4}"); + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | + = note: this note originates in the macro `uuid` (in Nightly builds, run with -Z macro-backtrace for more info) + +error[E0080]: evaluation panicked: invalid UUID + --> tests/ui/compile_fail/invalid_parse.rs:32:17 | 32 | const _: Uuid = uuid!("{F9168C5E-CEB2-4faa-B6BF-329Bz39FA1E4}"); - | ^ + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ evaluation of `_::OUTPUT` failed here + | + = note: this error originates in the macro `$crate::panic::panic_2021` which comes from the expansion of the macro `uuid` (in Nightly builds, run with -Z macro-backtrace for more info) -error: invalid group count: expected 5, found 2 +note: erroneous constant encountered + --> tests/ui/compile_fail/invalid_parse.rs:32:17 + | +32 | const _: Uuid = uuid!("{F9168C5E-CEB2-4faa-B6BF-329Bz39FA1E4}"); + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | + = note: this note originates in the macro `uuid` (in Nightly builds, run with -Z macro-backtrace for more info) + +error[E0080]: evaluation panicked: invalid UUID + --> tests/ui/compile_fail/invalid_parse.rs:35:17 + | +35 | const _: Uuid = uuid!("67e550-4105b1426f9247bb680e5fe0c"); + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ evaluation of `_::OUTPUT` failed here + | + = note: this error originates in the macro `$crate::panic::panic_2021` which comes from the expansion of the macro `uuid` (in Nightly builds, run with -Z macro-backtrace for more info) + +note: erroneous constant encountered --> tests/ui/compile_fail/invalid_parse.rs:35:17 | 35 | const _: Uuid = uuid!("67e550-4105b1426f9247bb680e5fe0c"); | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | - = note: this error originates in the macro `uuid` (in Nightly builds, run with -Z macro-backtrace for more info) + = note: this note originates in the macro `uuid` (in Nightly builds, run with -Z macro-backtrace for more info) -error: invalid character: expected an optional prefix of `urn:uuid:` followed by [0-9a-zA-Z], found `岡` at 7 - --> tests/ui/compile_fail/invalid_parse.rs:37:30 +error[E0080]: evaluation panicked: invalid UUID + --> tests/ui/compile_fail/invalid_parse.rs:37:17 | 37 | const _: Uuid = uuid!("504410岡林aab1426f9247bb680e5fe0c8"); - | ^^ + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ evaluation of `_::OUTPUT` failed here + | + = note: this error originates in the macro `$crate::panic::panic_2021` which comes from the expansion of the macro `uuid` (in Nightly builds, run with -Z macro-backtrace for more info) -error: invalid character: expected an optional prefix of `urn:uuid:` followed by [0-9a-zA-Z], found `😎` at 7 - --> tests/ui/compile_fail/invalid_parse.rs:38:30 +note: erroneous constant encountered + --> tests/ui/compile_fail/invalid_parse.rs:37:17 + | +37 | const _: Uuid = uuid!("504410岡林aab1426f9247bb680e5fe0c8"); + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | + = note: this note originates in the macro `uuid` (in Nightly builds, run with -Z macro-backtrace for more info) + +error[E0080]: evaluation panicked: invalid UUID + --> tests/ui/compile_fail/invalid_parse.rs:38:17 | 38 | const _: Uuid = uuid!("504410😎👍aab1426f9247bb680e5fe0c8"); - | ^^ + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ evaluation of `_::OUTPUT` failed here + | + = note: this error originates in the macro `$crate::panic::panic_2021` which comes from the expansion of the macro `uuid` (in Nightly builds, run with -Z macro-backtrace for more info) -error: invalid character: expected an optional prefix of `urn:uuid:` followed by [0-9a-zA-Z], found `👍` at 21 - --> tests/ui/compile_fail/invalid_parse.rs:40:44 +note: erroneous constant encountered + --> tests/ui/compile_fail/invalid_parse.rs:38:17 + | +38 | const _: Uuid = uuid!("504410😎👍aab1426f9247bb680e5fe0c8"); + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | + = note: this note originates in the macro `uuid` (in Nightly builds, run with -Z macro-backtrace for more info) + +error[E0080]: evaluation panicked: invalid UUID + --> tests/ui/compile_fail/invalid_parse.rs:40:17 | 40 | const _: Uuid = uuid!("{F9168C5E-CEB2-4faa-👍5-32BF39FA1E4}"); - | ^^ + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ evaluation of `_::OUTPUT` failed here + | + = note: this error originates in the macro `$crate::panic::panic_2021` which comes from the expansion of the macro `uuid` (in Nightly builds, run with -Z macro-backtrace for more info) -error: invalid length: expected length 32 for simple format, found 4 +note: erroneous constant encountered + --> tests/ui/compile_fail/invalid_parse.rs:40:17 + | +40 | const _: Uuid = uuid!("{F9168C5E-CEB2-4faa-👍5-32BF39FA1E4}"); + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | + = note: this note originates in the macro `uuid` (in Nightly builds, run with -Z macro-backtrace for more info) + +error[E0080]: evaluation panicked: invalid UUID + --> tests/ui/compile_fail/invalid_parse.rs:42:17 + | +42 | const _: Uuid = uuid!("F916"); + | ^^^^^^^^^^^^^ evaluation of `_::OUTPUT` failed here + | + = note: this error originates in the macro `$crate::panic::panic_2021` which comes from the expansion of the macro `uuid` (in Nightly builds, run with -Z macro-backtrace for more info) + +note: erroneous constant encountered --> tests/ui/compile_fail/invalid_parse.rs:42:17 | 42 | const _: Uuid = uuid!("F916"); | ^^^^^^^^^^^^^ | - = note: this error originates in the macro `uuid` (in Nightly builds, run with -Z macro-backtrace for more info) + = note: this note originates in the macro `uuid` (in Nightly builds, run with -Z macro-backtrace for more info) -error: invalid character: expected an optional prefix of `urn:uuid:` followed by [0-9a-zA-Z], found `x` at 5 - --> tests/ui/compile_fail/invalid_parse.rs:43:28 +error[E0080]: evaluation panicked: invalid UUID + --> tests/ui/compile_fail/invalid_parse.rs:43:17 | 43 | const _: Uuid = uuid!("F916x"); - | ^ + | ^^^^^^^^^^^^^^ evaluation of `_::OUTPUT` failed here + | + = note: this error originates in the macro `$crate::panic::panic_2021` which comes from the expansion of the macro `uuid` (in Nightly builds, run with -Z macro-backtrace for more info) + +note: erroneous constant encountered + --> tests/ui/compile_fail/invalid_parse.rs:43:17 + | +43 | const _: Uuid = uuid!("F916x"); + | ^^^^^^^^^^^^^^ + | + = note: this note originates in the macro `uuid` (in Nightly builds, run with -Z macro-backtrace for more info)