use crate::error::{ErrorCode, RexactError};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum Dialect {
Ecma,
Python,
Go,
Rust,
Pcre2,
Java,
}
impl Dialect {
pub const ALL: [Dialect; 5] = [
Dialect::Ecma,
Dialect::Python,
Dialect::Go,
Dialect::Rust,
Dialect::Pcre2,
];
pub const fn name(self) -> &'static str {
match self {
Dialect::Ecma => "ecma",
Dialect::Python => "python",
Dialect::Go => "go",
Dialect::Rust => "rust",
Dialect::Pcre2 => "pcre2",
Dialect::Java => "java",
}
}
pub fn from_name(s: &str) -> Result<Dialect, RexactError> {
Dialect::ALL
.into_iter()
.chain([Dialect::Java])
.find(|d| d.name() == s)
.ok_or_else(|| {
let valid: Vec<&str> = Dialect::ALL
.iter()
.chain([Dialect::Java].iter())
.map(|d| d.name())
.collect();
let mut e = RexactError::new(ErrorCode::P002);
e.detail = Some(format!("'{s}'; valid dialects: {}", valid.join(", ")));
e
})
}
}