build_target/
pointer_width.rs

1use std::{fmt, num::ParseIntError};
2
3use crate::utils::{build_env, define_target_enum};
4
5define_target_enum! {
6    /// The endianness of the target architecture.
7    #[derive(Clone, Debug, Eq, Hash, PartialEq, PartialOrd, Ord)]
8    #[non_exhaustive]
9    pub enum PointerWidth {
10        /// 16-bit pointer width.
11        U16 => "16",
12        /// 32-bit pointer width.
13        U32 => "32",
14        /// 64-bit pointer width.
15        U64 => "64",
16    }
17
18    as_str_doc = "String representing this target pointer width which matches `#[cfg(target_pointer_width)]`",
19    from_str_doc = "Tries to parse the given string as a [`PointerWidth`] falling back to [`PointerWidth::Other`] for unknown values.",
20}
21
22impl PointerWidth {
23    /// Gets the current target [`PointerWidth`].
24    #[must_use]
25    pub fn target() -> Self {
26        Self::from_str(build_env("CARGO_CFG_TARGET_POINTER_WIDTH"))
27    }
28}
29
30impl fmt::Display for PointerWidth {
31    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
32        f.write_str(self.as_str())
33    }
34}
35
36impl From<u8> for PointerWidth {
37    fn from(value: u8) -> Self {
38        match value {
39            64 => PointerWidth::U64,
40            32 => PointerWidth::U32,
41            16 => PointerWidth::U16,
42            _ => PointerWidth::Other(value.to_string()),
43        }
44    }
45}
46
47impl TryFrom<PointerWidth> for u8 {
48    type Error = ParseIntError;
49
50    fn try_from(value: PointerWidth) -> Result<Self, Self::Error> {
51        match value {
52            PointerWidth::U64 => Ok(64),
53            PointerWidth::U32 => Ok(32),
54            PointerWidth::U16 => Ok(16),
55            PointerWidth::Other(s) => s.parse(),
56        }
57    }
58}