ytdlp_ejs/
registry.rs

1//! JS Challenge Provider Registry
2//!
3//! This module manages runtime types and provider creation using enum dispatch.
4
5use crate::builtin::JsRuntimeProvider;
6use crate::provider::JsChallengeError;
7
8/// Runtime type for JavaScript execution
9#[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    /// Parse runtime type from string
25    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    /// Get list of available runtime names
42    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    /// Create a provider instance for the specified runtime type
58    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}