| // Copyright 2023 Google LLC |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| /// A Uuid as defined by the Core Specification (v5.4, Vol 3, Part B, Sec 2.5.1) |
| #[derive(Debug, Clone, Copy, Hash, PartialEq, Eq)] |
| pub struct Uuid(uuid::Uuid); |
| |
| impl Uuid { |
| // Non-changing parts of the Bluetooth Base UUID, for easy comparison and |
| // construction. |
| const BASE_UUID_B_PART: u16 = 0x0000; |
| const BASE_UUID_C_PART: u16 = 0x1000; |
| const BASE_UUID_D_PART: [u8; 8] = [0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB]; |
| |
| pub const fn from_u16(value: u16) -> Self { |
| Self::from_u32(value as u32) |
| } |
| |
| pub const fn from_u32(value: u32) -> Self { |
| Uuid(uuid::Uuid::from_fields( |
| value, |
| Self::BASE_UUID_B_PART, |
| Self::BASE_UUID_C_PART, |
| &Self::BASE_UUID_D_PART, |
| )) |
| } |
| |
| pub fn to_u16(&self) -> Option<u16> { |
| let x: u32 = self.to_u32()?; |
| x.try_into().ok() |
| } |
| |
| pub fn to_u32(&self) -> Option<u32> { |
| let (first, second, third, final_bytes) = self.0.as_fields(); |
| if second != Uuid::BASE_UUID_B_PART |
| || third != Uuid::BASE_UUID_C_PART |
| || final_bytes != &Uuid::BASE_UUID_D_PART |
| { |
| return None; |
| } |
| Some(first) |
| } |
| } |
| |
| impl From<Uuid> for uuid::Uuid { |
| fn from(value: Uuid) -> Self { |
| value.0 |
| } |
| } |
| |
| impl From<uuid::Uuid> for Uuid { |
| fn from(value: uuid::Uuid) -> Self { |
| Uuid(value) |
| } |
| } |
| |
| impl core::fmt::Display for Uuid { |
| fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { |
| write!(f, "{}", self.0.as_hyphenated()) |
| } |
| } |
| |
| impl core::str::FromStr for Uuid { |
| type Err = uuid::Error; |
| |
| fn from_str(s: &str) -> core::result::Result<Uuid, Self::Err> { |
| uuid::Uuid::parse_str(s).map(|uuid| Uuid(uuid)) |
| } |
| } |
| |
| #[cfg(test)] |
| mod tests { |
| use super::*; |
| |
| #[test] |
| fn uuid16() { |
| let uuid = Uuid::from_u16(0x180d); |
| assert_eq!("0000180d-0000-1000-8000-00805f9b34fb", uuid.to_string()); |
| let as16: u16 = uuid.to_u16().unwrap(); |
| assert_eq!(0x180d, as16); |
| } |
| } |