blob: ea9b9998a9fb26a8a1a05fb36e13a404f43fd507 [file] [log] [blame]
//! Rust architectures
use crate::error::Error;
use core::{fmt, str::FromStr};
#[cfg(feature = "serde")]
use serde::{de, de::Error as DeError, ser, Deserialize, Serialize};
/// `target_arch`: Target CPU architecture
#[derive(Copy, Clone, Debug, Eq, Hash, PartialEq, PartialOrd, Ord)]
#[non_exhaustive]
pub enum Arch {
/// `aarch64`: ARMv8 64-bit architecture
AArch64,
/// `arm`: 32-bit ARM architecture
Arm,
/// `avr`
Avr,
/// `bpf`
Bpf,
/// `csky`
Csky,
/// `hexagon`
Hexagon,
/// `loongarch64`
Loongarch64,
/// `m68k`
M68k,
/// `mips`: 32-bit MIPS CPU architecture
Mips,
/// `mips32r6`
Mips32r6,
/// `mips64`: 64-bit MIPS CPU architecture
Mips64,
/// `mips64r6`
Mips64r6,
/// `msp430`: 16-bit MSP430 microcontrollers
Msp430,
/// `nvptx64`: 64-bit NVIDIA PTX
Nvptx64,
/// `powerpc`: 32-bit POWERPC platform
PowerPc,
/// `powerpc64`: 64-bit POWERPC platform
PowerPc64,
/// `riscv32`
Riscv32,
/// `riscv64`
Riscv64,
/// `s390x`: 64-bit IBM z/Architecture
S390X,
/// `sparc`: 32-bit SPARC CPU architecture
Sparc,
/// `sparc64`: 64-bit SPARC CPU architecture
Sparc64,
/// `wasm32`: Web Assembly (32-bit)
Wasm32,
/// `wasm64`
Wasm64,
/// `x86`: Generic x86 CPU architecture
X86,
/// `x86_64`: 'AMD64' CPU architecture
X86_64,
}
impl Arch {
/// String representing this `Arch` which matches `#[cfg(target_arch)]`
pub fn as_str(self) -> &'static str {
match self {
Arch::AArch64 => "aarch64",
Arch::Arm => "arm",
Arch::Avr => "avr",
Arch::Bpf => "bpf",
Arch::Csky => "csky",
Arch::Hexagon => "hexagon",
Arch::Loongarch64 => "loongarch64",
Arch::M68k => "m68k",
Arch::Mips => "mips",
Arch::Mips32r6 => "mips32r6",
Arch::Mips64 => "mips64",
Arch::Mips64r6 => "mips64r6",
Arch::Msp430 => "msp430",
Arch::Nvptx64 => "nvptx64",
Arch::PowerPc => "powerpc",
Arch::PowerPc64 => "powerpc64",
Arch::Riscv32 => "riscv32",
Arch::Riscv64 => "riscv64",
Arch::S390X => "s390x",
Arch::Sparc => "sparc",
Arch::Sparc64 => "sparc64",
Arch::Wasm32 => "wasm32",
Arch::Wasm64 => "wasm64",
Arch::X86 => "x86",
Arch::X86_64 => "x86_64",
}
}
}
impl FromStr for Arch {
type Err = Error;
/// Create a new `Arch` from the given string
fn from_str(name: &str) -> Result<Self, Self::Err> {
let result = match name {
"aarch64" => Arch::AArch64,
"arm" => Arch::Arm,
"avr" => Arch::Avr,
"bpf" => Arch::Bpf,
"csky" => Arch::Csky,
"hexagon" => Arch::Hexagon,
"loongarch64" => Arch::Loongarch64,
"m68k" => Arch::M68k,
"mips" => Arch::Mips,
"mips32r6" => Arch::Mips32r6,
"mips64" => Arch::Mips64,
"mips64r6" => Arch::Mips64r6,
"msp430" => Arch::Msp430,
"nvptx64" => Arch::Nvptx64,
"powerpc" => Arch::PowerPc,
"powerpc64" => Arch::PowerPc64,
"riscv32" => Arch::Riscv32,
"riscv64" => Arch::Riscv64,
"s390x" => Arch::S390X,
"sparc" => Arch::Sparc,
"sparc64" => Arch::Sparc64,
"wasm32" => Arch::Wasm32,
"wasm64" => Arch::Wasm64,
"x86" => Arch::X86,
"x86_64" => Arch::X86_64,
_ => return Err(Error),
};
Ok(result)
}
}
impl fmt::Display for Arch {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.write_str(self.as_str())
}
}
#[cfg(feature = "serde")]
impl Serialize for Arch {
fn serialize<S: ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
serializer.serialize_str(self.as_str())
}
}
#[cfg(all(feature = "serde", feature = "std"))]
impl<'de> Deserialize<'de> for Arch {
fn deserialize<D: de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
let string = std::string::String::deserialize(deserializer)?;
string.parse().map_err(|_| {
D::Error::custom(std::format!(
"Unrecognized value '{}' for target_arch",
string
))
})
}
}