Skip to main content

brk_bindgen/backends/
rust.rs

1//! Rust language syntax implementation.
2
3use crate::{GenericSyntax, LanguageSyntax, to_snake_case};
4
5/// Rust-specific code generation syntax.
6pub struct RustSyntax;
7
8impl LanguageSyntax for RustSyntax {
9    fn field_name(&self, name: &str) -> String {
10        to_snake_case(name)
11    }
12
13    fn path_expr(&self, base_var: &str, suffix: &str) -> String {
14        format!("format!(\"{{{}}}{}\")", base_var, suffix)
15    }
16
17    fn suffix_expr(&self, acc_var: &str, relative: &str) -> String {
18        if relative.is_empty() {
19            // Identity: just return acc
20            format!("{}.clone()", acc_var)
21        } else {
22            // _m(&acc, relative) -> if acc.is_empty() { relative } else { format!("{acc}_{relative}") }
23            format!("_m(&{}, \"{}\")", acc_var, relative)
24        }
25    }
26
27    fn prefix_expr(&self, prefix: &str, acc_var: &str) -> String {
28        if prefix.is_empty() {
29            // Identity: just return acc
30            format!("{}.clone()", acc_var)
31        } else {
32            // _p(prefix, &acc) -> if acc.is_empty() { prefix_base } else { format!("{prefix}{acc}") }
33            let prefix_base = prefix.trim_end_matches('_');
34            format!("_p(\"{}\", &{})", prefix_base, acc_var)
35        }
36    }
37
38    fn constructor(&self, type_name: &str, path_expr: &str) -> String {
39        format!("{}::new(client.clone(), {})", type_name, path_expr)
40    }
41
42    fn field_init(&self, indent: &str, name: &str, _type_ann: &str, value: &str) -> String {
43        // Rust struct initialization; type is in struct definition, not in init
44        format!("{}{}: {},", indent, name, value)
45    }
46
47    fn generic_syntax(&self) -> GenericSyntax {
48        GenericSyntax::RUST
49    }
50
51    fn string_literal(&self, value: &str) -> String {
52        format!("\"{}\".to_string()", value)
53    }
54
55    fn constructor_name(&self, type_name: &str) -> String {
56        format!("{}::new", type_name)
57    }
58}