1use std::fmt;
2use serde::{Serialize, Deserialize};
3use crate::Error;
4use std::borrow::Cow;
5
6const PACKAGE_TARGET: &str = env!("PACKAGE_TARGET");
7
8pub fn package_target() -> Result<Target, Error> {
14 let target = PACKAGE_TARGET.parse()?;
15 Ok(target)
16}
17
18#[derive(Debug, Clone, Hash, PartialEq, Eq, Serialize)]
31#[serde(transparent)]
32pub struct Target(Cow<'static, str>);
33
34#[allow(non_upper_case_globals)]
35impl Target {
36 pub const X86_64AppleDarwin: Target = Target(Cow::Borrowed("x86_64-apple-darwin"));
39 pub const X86_64UnknownLinuxMusl: Target = Target(Cow::Borrowed("x86_64-unknown-linux-musl"));
40 pub const ALL_TARGETS: &'static [Target] =
41 &[Target::X86_64AppleDarwin, Target::X86_64UnknownLinuxMusl];
42
43 pub fn as_str(&self) -> &str {
44 self.0.as_ref()
45 }
46}
47
48impl std::str::FromStr for Target {
49 type Err = Error;
50
51 fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
64 let platform = match s {
65 "x86_64-apple-darwin" => Self::X86_64AppleDarwin,
66 "x86_64-unknown-linux-musl" => Self::X86_64UnknownLinuxMusl,
67 "x86_64-unknown-linux-gnu" => Self::X86_64UnknownLinuxMusl,
68 other => Self(Cow::Owned(other.to_owned())),
69 };
70 Ok(platform)
71 }
72}
73
74impl fmt::Display for Target {
75 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
76 write!(f, "{}", self.as_str())
77 }
78}
79
80impl<'de> Deserialize<'de> for Target {
81 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
82 where
83 D: serde::Deserializer<'de>,
84 {
85 let string = String::deserialize(deserializer)?;
86 let me: Self = std::str::FromStr::from_str(&string).map_err(|e: Error| {
87 serde::de::Error::invalid_value(
88 serde::de::Unexpected::Other(&e.to_string()),
89 &"valid Target",
90 )
91 })?;
92 Ok(me)
93 }
94}