Skip to main content

chipi_core/backend/
rust.rs

1//! Rust code generation backend.
2//!
3//! Generates `.rs` files with instruction enums, decode functions,
4//! display implementations, and sub-decoder dispatch code.
5
6use crate::codegen;
7use crate::config::GenTarget;
8use crate::tree;
9use crate::types::ValidatedDef;
10
11use super::{CodegenBackend, CodegenError};
12
13/// The Rust code generation backend.
14pub struct RustBackend;
15
16impl CodegenBackend for RustBackend {
17    fn lang(&self) -> &str {
18        "rust"
19    }
20
21    fn validate_lang_options(&self, options: &toml::Value) -> Result<(), Vec<String>> {
22        if let toml::Value::Table(table) = options {
23            if !table.is_empty() {
24                let keys: Vec<String> = table
25                    .keys()
26                    .map(|k| format!("unknown lang_option: {}", k))
27                    .collect();
28                return Err(keys);
29            }
30        }
31        Ok(())
32    }
33
34    fn generate(&self, ir: &ValidatedDef, config: &GenTarget) -> Result<String, CodegenError> {
35        let tree = tree::build_tree(ir);
36        let code = codegen::generate_code(ir, &tree, &config.type_map, &config.dispatch_overrides);
37        Ok(code)
38    }
39
40    fn formatter_command(&self) -> Option<&[&str]> {
41        Some(&["rustfmt"])
42    }
43}