1use std::collections::HashMap;
2pub trait Dialect: std::fmt::Debug {
3 fn name(&self) -> &str;
4 fn verify_op(&self, op_name: &str, num_inputs: usize, num_results: usize)
5 -> Result<(), String>;
6}
7
8#[derive(Debug, Default)]
9pub struct DialectRegistry {
10 dialects: HashMap<String, Box<dyn Dialect>>,
11}
12
13impl DialectRegistry {
14 pub fn new() -> Self {
15 Self::default()
16 }
17
18 pub fn register(&mut self, dialect: Box<dyn Dialect>) {
19 self.dialects.insert(dialect.name().to_string(), dialect);
20 }
21
22 pub fn get(&self, name: &str) -> Option<&dyn Dialect> {
23 self.dialects.get(name).map(|d| d.as_ref())
24 }
25
26 pub fn has(&self, name: &str) -> bool {
27 self.dialects.contains_key(name)
28 }
29
30 pub fn names(&self) -> Vec<&str> {
31 self.dialects.keys().map(|s| s.as_str()).collect()
32 }
33}
34
35#[derive(Debug)]
36pub struct CoreDialect;
37
38impl Dialect for CoreDialect {
39 fn name(&self) -> &str {
40 "core"
41 }
42
43 fn verify_op(
44 &self,
45 op_name: &str,
46 _num_inputs: usize,
47 _num_results: usize,
48 ) -> Result<(), String> {
49 match op_name {
50 "core.constant" | "core.return" | "core.call" | "core.br" | "core.cond_br" => Ok(()),
51 _ => Err(format!("Unknown core operation: {}", op_name)),
52 }
53 }
54}
55
56pub fn register_builtin_dialects(registry: &mut DialectRegistry) {
57 registry.register(Box::new(CoreDialect));
58}