1use crate::error::{ErrorCode, RexactError};
4
5#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
8pub enum Dialect {
9 Ecma,
11 Python,
13 Go,
15 Rust,
17 Pcre2,
19 Java,
21}
22
23impl Dialect {
24 pub const ALL: [Dialect; 5] = [
26 Dialect::Ecma,
27 Dialect::Python,
28 Dialect::Go,
29 Dialect::Rust,
30 Dialect::Pcre2,
31 ];
32
33 pub const fn name(self) -> &'static str {
35 match self {
36 Dialect::Ecma => "ecma",
37 Dialect::Python => "python",
38 Dialect::Go => "go",
39 Dialect::Rust => "rust",
40 Dialect::Pcre2 => "pcre2",
41 Dialect::Java => "java",
42 }
43 }
44
45 pub fn from_name(s: &str) -> Result<Dialect, RexactError> {
47 Dialect::ALL
48 .into_iter()
49 .chain([Dialect::Java])
50 .find(|d| d.name() == s)
51 .ok_or_else(|| {
52 let valid: Vec<&str> = Dialect::ALL
53 .iter()
54 .chain([Dialect::Java].iter())
55 .map(|d| d.name())
56 .collect();
57 let mut e = RexactError::new(ErrorCode::P002);
58 e.detail = Some(format!("'{s}'; valid dialects: {}", valid.join(", ")));
59 e
60 })
61 }
62}