summaryrefslogtreecommitdiffstats
path: root/third_party/rust/uuid/examples/windows_guid.rs
diff options
context:
space:
mode:
Diffstat (limited to 'third_party/rust/uuid/examples/windows_guid.rs')
-rw-r--r--third_party/rust/uuid/examples/windows_guid.rs112
1 files changed, 112 insertions, 0 deletions
diff --git a/third_party/rust/uuid/examples/windows_guid.rs b/third_party/rust/uuid/examples/windows_guid.rs
new file mode 100644
index 0000000000..6cbc10ed68
--- /dev/null
+++ b/third_party/rust/uuid/examples/windows_guid.rs
@@ -0,0 +1,112 @@
+//! 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() {}