use crate::error::Error;
use core::{fmt, str::FromStr};
#[cfg(feature = "serde")]
use serde::{de, de::Error as DeError, ser, Deserialize, Serialize};
#[derive(Copy, Clone, Debug, Eq, Hash, PartialEq, PartialOrd, Ord)]
#[non_exhaustive]
pub enum Arch {
AArch64,
Amdgpu,
Arm,
Arm64ec,
Avr,
Bpf,
Csky,
Hexagon,
Loongarch32,
Loongarch64,
M68k,
Mips,
Mips32r6,
Mips64,
Mips64r6,
Msp430,
Nvptx64,
PowerPc,
PowerPc64,
Riscv32,
Riscv64,
S390X,
Sparc,
Sparc64,
Wasm32,
Wasm64,
X86,
X86_64,
Xtensa,
}
impl Arch {
pub fn as_str(self) -> &'static str {
match self {
Arch::AArch64 => "aarch64",
Arch::Amdgpu => "amdgpu",
Arch::Arm => "arm",
Arch::Arm64ec => "arm64ec",
Arch::Avr => "avr",
Arch::Bpf => "bpf",
Arch::Csky => "csky",
Arch::Hexagon => "hexagon",
Arch::Loongarch32 => "loongarch32",
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",
Arch::Xtensa => "xtensa",
}
}
}
impl FromStr for Arch {
type Err = Error;
fn from_str(name: &str) -> Result<Self, Self::Err> {
let result = match name {
"aarch64" => Arch::AArch64,
"amdgpu" => Arch::Amdgpu,
"arm" => Arch::Arm,
"arm64ec" => Arch::Arm64ec,
"avr" => Arch::Avr,
"bpf" => Arch::Bpf,
"csky" => Arch::Csky,
"hexagon" => Arch::Hexagon,
"loongarch32" => Arch::Loongarch32,
"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,
"xtensa" => Arch::Xtensa,
_ => 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
))
})
}
}