Skip to main content

wslplugins_rs/user_distribution_id/fmt/
guid_formatter.rs

1use 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        // SAFETY: All bytes are valid ASCII characters.
37        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}