aardvark_core/
runtime_language.rs

1use std::fmt;
2use std::str::FromStr;
3
4use serde::{de, Deserialize, Deserializer, Serialize, Serializer};
5
6/// Supported guest language runtimes.
7#[derive(Clone, Copy, Debug, PartialEq, Eq)]
8pub enum RuntimeLanguage {
9    Python,
10    JavaScript,
11}
12
13impl RuntimeLanguage {
14    /// Returns a lowercase string identifier for the language.
15    pub const fn as_str(self) -> &'static str {
16        match self {
17            Self::Python => "python",
18            Self::JavaScript => "javascript",
19        }
20    }
21}
22
23impl Default for RuntimeLanguage {
24    fn default() -> Self {
25        Self::Python
26    }
27}
28
29impl fmt::Display for RuntimeLanguage {
30    fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
31        formatter.write_str(self.as_str())
32    }
33}
34
35impl FromStr for RuntimeLanguage {
36    type Err = ();
37
38    fn from_str(value: &str) -> Result<Self, Self::Err> {
39        match value.trim().to_ascii_lowercase().as_str() {
40            "python" => Ok(Self::Python),
41            "javascript" | "js" => Ok(Self::JavaScript),
42            _ => Err(()),
43        }
44    }
45}
46
47impl Serialize for RuntimeLanguage {
48    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
49    where
50        S: Serializer,
51    {
52        serializer.serialize_str(self.as_str())
53    }
54}
55
56impl<'de> Deserialize<'de> for RuntimeLanguage {
57    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
58    where
59        D: Deserializer<'de>,
60    {
61        let value = String::deserialize(deserializer)?;
62        Self::from_str(&value).map_err(|_| {
63            de::Error::custom(format!(
64                "unsupported runtime language '{}'; expected 'python' or 'javascript'",
65                value
66            ))
67        })
68    }
69}