1use crate::builtin::JsRuntimeProvider;
6use crate::provider::JsChallengeError;
7
8#[derive(Debug, Clone, Copy, PartialEq, Eq)]
10pub enum RuntimeType {
11 #[cfg(feature = "qjs")]
12 QuickJS,
13 #[cfg(feature = "boa")]
14 Boa,
15 #[cfg(feature = "external")]
16 Deno,
17 #[cfg(feature = "external")]
18 Node,
19 #[cfg(feature = "external")]
20 Bun,
21}
22
23impl RuntimeType {
24 pub fn parse(s: &str) -> Option<Self> {
26 match s.to_lowercase().as_str() {
27 #[cfg(feature = "qjs")]
28 "qjs" | "quickjs" => Some(Self::QuickJS),
29 #[cfg(feature = "external")]
30 "deno" => Some(Self::Deno),
31 #[cfg(feature = "boa")]
32 "boa" => Some(Self::Boa),
33 #[cfg(feature = "external")]
34 "node" | "nodejs" => Some(Self::Node),
35 #[cfg(feature = "external")]
36 "bun" => Some(Self::Bun),
37 _ => None,
38 }
39 }
40
41 pub fn available_runtimes() -> Vec<&'static str> {
43 vec![
44 #[cfg(feature = "qjs")]
45 "qjs",
46 #[cfg(feature = "external")]
47 "deno",
48 #[cfg(feature = "boa")]
49 "boa",
50 #[cfg(feature = "external")]
51 "node",
52 #[cfg(feature = "external")]
53 "bun",
54 ]
55 }
56
57 pub fn create_provider(&self, code: &str) -> Result<JsRuntimeProvider, JsChallengeError> {
59 match self {
60 #[cfg(feature = "qjs")]
61 RuntimeType::QuickJS => Ok(JsRuntimeProvider::QuickJS(
62 crate::builtin::quickjs::QuickJSJCP::new(code)?,
63 )),
64 #[cfg(feature = "boa")]
65 RuntimeType::Boa => Ok(JsRuntimeProvider::Boa(Box::new(
66 crate::builtin::boa::BoaJCP::new(code)?,
67 ))),
68 #[cfg(feature = "external")]
69 RuntimeType::Deno => Ok(JsRuntimeProvider::Deno(crate::builtin::deno::DenoJCP::new(
70 code,
71 ))),
72 #[cfg(feature = "external")]
73 RuntimeType::Node => Ok(JsRuntimeProvider::Node(crate::builtin::node::NodeJCP::new(
74 code,
75 ))),
76 #[cfg(feature = "external")]
77 RuntimeType::Bun => Ok(JsRuntimeProvider::Bun(crate::builtin::bun::BunJCP::new(
78 code,
79 ))),
80 }
81 }
82}