use crate::named::named;
named! {
pub enum Language {
Jsx = "jsx",
Tsx = "tsx",
Svelte = "svelte",
Js = "js",
Ts = "ts",
}
}
impl Language {
#[must_use]
pub fn runtimes(self) -> &'static [&'static str] {
match self {
Self::Jsx | Self::Tsx => &["react@19", "preact@10"],
Self::Svelte => &["svelte@5"],
Self::Js | Self::Ts => &[],
}
}
#[must_use]
pub fn runs(self, runtime: Option<&str>) -> bool {
runtime.is_none_or(|runtime| self.runtimes().contains(&runtime))
}
#[must_use]
pub fn runtime(self, runtime: Option<&str>) -> Option<&str> {
runtime.or_else(|| self.runtimes().first().copied())
}
#[must_use]
pub fn has_runtimes(self) -> bool {
!self.runtimes().is_empty()
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn each_binding_runs_its_runtimes() {
assert!(Language::Jsx.runs(None));
assert!(Language::Tsx.runs(Some("preact@10")));
assert!(!Language::Svelte.runs(Some("svelte@4")));
assert!(!Language::Js.runs(Some("react@19")));
assert!(Language::Svelte.has_runtimes());
assert!(!Language::Ts.has_runtimes());
assert_eq!(Language::Jsx.runtime(None), Some("react@19"));
assert_eq!(Language::Tsx.runtime(Some("preact@10")), Some("preact@10"));
assert_eq!(Language::Js.runtime(None), None);
assert_eq!(Language::from_name("vue"), None);
}
}