build_target/
pointer_width.rs1use std::{fmt, num::ParseIntError};
2
3use crate::utils::{build_env, define_target_enum};
4
5define_target_enum! {
6 #[derive(Clone, Debug, Eq, Hash, PartialEq, PartialOrd, Ord)]
8 #[non_exhaustive]
9 pub enum PointerWidth {
10 U16 => "16",
12 U32 => "32",
14 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 #[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}