selene_lib/standard_library/
lua_versions.rs

1use std::str::FromStr;
2
3use serde::{Deserialize, Serialize};
4
5#[derive(Clone, Debug, PartialEq, Eq)]
6pub enum LuaVersion {
7    Lua51,
8    Lua52,
9    Lua53,
10    Lua54,
11    Luau,
12    LuaJIT,
13
14    Unknown(String),
15}
16
17impl LuaVersion {
18    pub fn to_str(&self) -> &str {
19        match self {
20            Self::Lua51 => "lua51",
21            Self::Lua52 => "lua52",
22            Self::Lua53 => "lua53",
23            Self::Lua54 => "lua54",
24            Self::Luau => "luau",
25            Self::LuaJIT => "luajit",
26            Self::Unknown(value) => value,
27        }
28    }
29
30    pub fn to_lua_version(&self) -> Result<full_moon::ast::LuaVersion, LuaVersionError> {
31        match self {
32            Self::Lua51 => Ok(full_moon::ast::LuaVersion::lua51()),
33
34            #[cfg(feature = "lua52")]
35            Self::Lua52 => Ok(full_moon::ast::LuaVersion::lua52()),
36
37            #[cfg(feature = "lua53")]
38            Self::Lua53 => Ok(full_moon::ast::LuaVersion::lua53()),
39
40            #[cfg(feature = "lua54")]
41            Self::Lua54 => Ok(full_moon::ast::LuaVersion::lua54()),
42
43            #[cfg(feature = "roblox")]
44            Self::Luau => Ok(full_moon::ast::LuaVersion::luau()),
45
46            #[cfg(feature = "luajit")]
47            Self::LuaJIT => Ok(full_moon::ast::LuaVersion::luajit()),
48
49            Self::Unknown(value) => Err(LuaVersionError::Unknown(value)),
50
51            #[allow(unreachable_patterns)]
52            _ => Err(LuaVersionError::FeatureNotEnabled(self.to_str())),
53        }
54    }
55}
56
57impl FromStr for LuaVersion {
58    type Err = ();
59
60    fn from_str(value: &str) -> Result<Self, Self::Err> {
61        match value {
62            "lua51" => Ok(Self::Lua51),
63            "lua52" => Ok(Self::Lua52),
64            "lua53" => Ok(Self::Lua53),
65            "lua54" => Ok(Self::Lua54),
66            "luau" => Ok(Self::Luau),
67            "luajit" => Ok(Self::LuaJIT),
68            _ => Err(()),
69        }
70    }
71}
72
73pub enum LuaVersionError<'a> {
74    FeatureNotEnabled(&'a str),
75    Unknown(&'a str),
76}
77
78impl Serialize for LuaVersion {
79    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
80    where
81        S: serde::Serializer,
82    {
83        serializer.serialize_str(self.to_str())
84    }
85}
86
87impl<'de> Deserialize<'de> for LuaVersion {
88    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
89    where
90        D: serde::Deserializer<'de>,
91    {
92        let value = String::deserialize(deserializer)?;
93        if let Ok(version) = Self::from_str(&value) {
94            Ok(version)
95        } else {
96            Ok(Self::Unknown(value))
97        }
98    }
99}