selene_lib/standard_library/
lua_versions.rs1use 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}