wslplugins_rs/user_distribution_id/fmt/
guid_formatter.rs1use std::{
2 fmt::{LowerHex, UpperHex},
3 io::Write,
4 str::FromStr,
5};
6
7use crate::user_distribution_id::ParseError;
8use windows_core::GUID;
9
10use crate::{user_distribution_id::fmt::formatter::Formatter, UserDistributionID};
11pub struct GuidFormatter(GUID);
12
13impl GuidFormatter {
14 const ENCODE_BUFFER: [u8; 36] = [0u8; 36];
15}
16
17impl Formatter for GuidFormatter {}
18
19impl UpperHex for GuidFormatter {
20 #[inline]
21 #[expect(clippy::use_debug, reason = "Guid debug format is what we expect")]
22 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
23 write!(f, "{:?}", self.0)
24 }
25}
26
27impl LowerHex for GuidFormatter {
28 #[inline]
29 #[expect(clippy::use_debug, reason = "Guid debug format is what we expect")]
30 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
31 let mut buffer = Self::ENCODE_BUFFER;
32 write!(&mut buffer[..], "{:?}", self.0).map_err(|_| std::fmt::Error)?;
33 for b in &mut buffer {
34 *b = b.to_ascii_lowercase();
35 }
36 let s = unsafe { core::str::from_utf8_unchecked(&buffer) };
38 f.write_str(s)
39 }
40}
41
42impl From<GuidFormatter> for UserDistributionID {
43 #[inline]
44 fn from(value: GuidFormatter) -> Self {
45 value.0.into()
46 }
47}
48
49impl From<UserDistributionID> for GuidFormatter {
50 #[inline]
51 fn from(value: UserDistributionID) -> Self {
52 Self(GUID::from(value))
53 }
54}
55
56impl FromStr for GuidFormatter {
57 type Err = ParseError;
58 #[inline]
59 fn from_str(s: &str) -> Result<Self, Self::Err> {
60 Ok(GUID::try_from(s).map(Self)?)
61 }
62}