// Copyright 2022 Google LLC // // 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. //! Library providing a GUID (Globally Unique Identifier) type. The //! format is defined in [RFC 4122]. However, unlike "normal" UUIDs //! (such as those provided by the [`uuid`] crate), the first three //! fields are little-endian. See [Appendix A] of the UEFI //! Specification. This format of GUID is also used in Microsoft //! Windows. //! //! [Appendix A]: https://uefi.org/specs/UEFI/2.10/Apx_A_GUID_and_Time_Formats.html //! [RFC 4122]: https://datatracker.ietf.org/doc/html/rfc4122 //! [`uuid`]: https://docs.rs/uuid/latest/uuid //! //! # Features //! //! No features are enabled by default. //! //! * `bytemuck`: Implements bytemuck's `Pod` and `Zeroable` traits for `Guid`. //! * `serde`: Implements serde's `Serialize` and `Deserialize` traits for `Guid`. //! * `std`: Provides `std::error::Error` implementation for the error type. //! //! # Examples //! //! Construct a GUID at compile time with the `guid!` macro: //! //! ``` //! use uguid::guid; //! //! let guid = guid!("01234567-89ab-cdef-0123-456789abcdef"); //! ``` //! //! Parse a GUID at runtime from a string: //! //! ``` //! use uguid::Guid; //! //! let guid: Guid = "01234567-89ab-cdef-0123-456789abcdef".parse().unwrap(); //! ``` //! //! Construct a GUID from its components or a byte array: //! //! ``` //! use uguid::Guid; //! //! ##[rustfmt::skip] //! let guid1 = Guid::from_bytes([ //! 0x01, 0x02, 0x03, 0x04, //! 0x05, 0x06, 0x07, 0x08, //! 0x09, 0x10, 0x11, 0x12, //! 0x13, 0x14, 0x15, 0x16, //! ]); //! let guid2 = Guid::new( //! [0x01, 0x02, 0x03, 0x04], //! [0x05, 0x06], //! [0x07, 0x08], //! 0x09, //! 0x10, //! [0x11, 0x12, 0x13, 0x14, 0x15, 0x16], //! ); //! assert_eq!(guid1, guid2); //! ``` //! //! Convert to a string or a byte array: //! //! ``` //! use uguid::guid; //! //! let guid = guid!("01234567-89ab-cdef-0123-456789abcdef"); //! assert_eq!(guid.to_string(), "01234567-89ab-cdef-0123-456789abcdef"); //! assert_eq!( //! guid.to_bytes(), //! [ //! 0x67, 0x45, 0x23, 0x01, 0xab, 0x89, 0xef, 0xcd, 0x01, 0x23, 0x45, //! 0x67, 0x89, 0xab, 0xcd, 0xef //! ] //! ); //! ``` #![cfg_attr(not(feature = "std"), no_std)] #![cfg_attr(docsrs, feature(doc_auto_cfg))] #![warn(missing_copy_implementations)] #![warn(missing_debug_implementations)] #![warn(missing_docs)] #![warn(trivial_casts)] #![warn(trivial_numeric_casts)] #![warn(unreachable_pub)] #![warn(unsafe_code)] #![warn(clippy::pedantic)] #![warn(clippy::as_conversions)] #![allow(clippy::missing_errors_doc)] #![allow(clippy::module_name_repetitions)] /// Macro replacement for the `?` operator, which cannot be used in /// const functions. macro_rules! mtry { ($expr:expr $(,)?) => { match $expr { Ok(val) => val, Err(err) => { return Err(err); } } }; } mod error; mod guid; mod util; pub use error::GuidFromStrError; pub use guid::{Guid, Variant}; #[cfg(feature = "std")] impl std::error::Error for GuidFromStrError {} /// Create a [`Guid`] from a string at compile time. /// /// # Examples /// /// ``` /// use uguid::{guid, Guid}; /// assert_eq!( /// guid!("01234567-89ab-cdef-0123-456789abcdef"), /// Guid::new( /// [0x67, 0x45, 0x23, 0x01], /// [0xab, 0x89], /// [0xef, 0xcd], /// 0x01, /// 0x23, /// [0x45, 0x67, 0x89, 0xab, 0xcd, 0xef], /// ) /// ); /// ``` #[macro_export] macro_rules! guid { ($s:literal) => {{ // Create a temporary const value to force an error in the input // to fail at compile time. const G: $crate::Guid = $crate::Guid::parse_or_panic($s); G }}; }