[bt-common] Add parsing of 16-bit UUIDs Test: updated tests; cargo test Change-Id: I25a2168d70cbcb82aa057d4a8006dc016da7286a Reviewed-on: https://bluetooth-review.git.corp.google.com/c/bluetooth/+/1380 Reviewed-by: Ani Ramakrishnan <aniramakri@google.com>
diff --git a/rust/bt-common/src/packet_encoding.rs b/rust/bt-common/src/packet_encoding.rs index 10058b8..3667ee1 100644 --- a/rust/bt-common/src/packet_encoding.rs +++ b/rust/bt-common/src/packet_encoding.rs
@@ -26,8 +26,8 @@ fn encode(&self, buf: &mut [u8]) -> ::core::result::Result<(), Self::Error>; } -/// Generates an enum value where each variant can be converted into a constant in the given -/// raw_type. +/// Generates an enum value where each variant can be converted into a constant +/// in the given raw_type. /// /// For example: /// decodable_enum! { @@ -126,4 +126,7 @@ #[error("Unrecognized type for {0}: {1}")] UnrecognizedType(String, u8), + + #[error("Uuid parsing error: {0}")] + Uuid(uuid::Error), }
diff --git a/rust/bt-common/src/uuids.rs b/rust/bt-common/src/uuids.rs index bb7c0d0..f640805 100644 --- a/rust/bt-common/src/uuids.rs +++ b/rust/bt-common/src/uuids.rs
@@ -72,10 +72,19 @@ } impl core::str::FromStr for Uuid { - type Err = uuid::Error; + type Err = crate::packet_encoding::Error; fn from_str(s: &str) -> core::result::Result<Uuid, Self::Err> { - uuid::Uuid::parse_str(s).map(|uuid| Uuid(uuid)) + if s.len() == 4 || s.len() == 6 { + return match u16::from_str_radix(&s[s.len() - 4..], 16) { + Ok(short) => Ok(Uuid::from_u16(short)), + Err(_) => Err(crate::packet_encoding::Error::InvalidParameter(s.to_owned())), + }; + } + match uuid::Uuid::parse_str(s) { + Ok(uuid) => Ok(Uuid(uuid)), + Err(e) => Err(crate::packet_encoding::Error::Uuid(e)), + } } } @@ -258,4 +267,17 @@ assert_eq!(test_map.get(&Uuid::from_u16(0x1234)).unwrap().name, "Test 2"); } + + #[test] + fn parse() { + assert_eq!("1814".parse(), Ok(Uuid::from_u16(0x1814))); + assert_eq!("0x2a79".parse(), Ok(Uuid::from_u16(0x2a79))); + let unknown_long_uuid = "2686f39c-bada-4658-854a-a62e7e5e8b8d"; + assert_eq!( + unknown_long_uuid.parse(), + Ok::<Uuid, crate::packet_encoding::Error>( + uuid::Uuid::parse_str(unknown_long_uuid).unwrap().into() + ) + ); + } }