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