//! Converting between Windows GUIDs and UUIDs. //! //! Windows GUIDs are specified as using mixed endianness. //! What you get will depend on the source of the GUID. //! Functions like `CoCreateGuid` will generate a valid UUID so //! the fields will be naturally ordered for `Uuid::from_fields`. //! Other GUIDs might need to be passed to `Uuid::from_fields_le` //! to have their ordering swapped. #[test] #[cfg(windows)] fn guid_to_uuid() { use uuid::Uuid; use windows_sys::core; let guid_in = core::GUID { data1: 0x4a35229d, data2: 0x5527, data3: 0x4f30, data4: [0x86, 0x47, 0x9d, 0xc5, 0x4e, 0x1e, 0xe1, 0xe8], }; let uuid = Uuid::from_fields(guid_in.data1, guid_in.data2, guid_in.data3, &guid_in.data4); let guid_out = { let fields = uuid.as_fields(); core::GUID { data1: fields.0, data2: fields.1, data3: fields.2, data4: *fields.3, } }; assert_eq!( (guid_in.data1, guid_in.data2, guid_in.data3, guid_in.data4), ( guid_out.data1, guid_out.data2, guid_out.data3, guid_out.data4 ) ); } #[test] #[cfg(windows)] fn guid_to_uuid_le_encoded() { use uuid::Uuid; use windows_sys::core; // A GUID might not be encoded directly as a UUID // If its fields are stored in little-endian order they might // need to be flipped. Whether or not this is necessary depends // on the source of the GUID let guid_in = core::GUID { data1: 0x9d22354a, data2: 0x2755, data3: 0x304f, data4: [0x86, 0x47, 0x9d, 0xc5, 0x4e, 0x1e, 0xe1, 0xe8], }; let uuid = Uuid::from_fields_le(guid_in.data1, guid_in.data2, guid_in.data3, &guid_in.data4); let guid_out = { let fields = uuid.to_fields_le(); core::GUID { data1: fields.0, data2: fields.1, data3: fields.2, data4: *fields.3, } }; assert_eq!( (guid_in.data1, guid_in.data2, guid_in.data3, guid_in.data4), ( guid_out.data1, guid_out.data2, guid_out.data3, guid_out.data4 ) ); } #[test] #[cfg(windows)] fn uuid_from_cocreateguid() { use uuid::{Uuid, Variant, Version}; use windows_sys::core; use windows_sys::Win32::System::Com::CoCreateGuid; let mut guid = core::GUID { data1: 0, data2: 0, data3: 0, data4: [0u8; 8], }; unsafe { CoCreateGuid(&mut guid); } let uuid = Uuid::from_fields(guid.data1, guid.data2, guid.data3, &guid.data4); assert_eq!(Variant::RFC4122, uuid.get_variant()); assert_eq!(Some(Version::Random), uuid.get_version()); } fn main() {}