build_target/
pointer_width.rs

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