baobao_codegen/language/
naming.rs

1//! Naming conventions for different programming languages.
2
3/// Language-specific naming conventions.
4///
5/// Defines how to transform command names, field names, and handle reserved words.
6#[derive(Debug, Clone, Copy)]
7pub struct NamingConvention {
8    /// Transform command name to type name (e.g., "hello-world" -> "HelloWorld")
9    pub command_to_type: fn(&str) -> String,
10    /// Transform command name to file name (e.g., "hello-world" -> "hello_world")
11    pub command_to_file: fn(&str) -> String,
12    /// Transform field name to language-specific name
13    pub field_to_name: fn(&str) -> String,
14    /// List of reserved words in the language
15    pub reserved_words: &'static [&'static str],
16    /// Escape a reserved word (e.g., "type" -> "r#type" in Rust)
17    pub escape_reserved: fn(&str) -> String,
18}
19
20impl NamingConvention {
21    /// Check if a name is a reserved word.
22    pub fn is_reserved(&self, name: &str) -> bool {
23        self.reserved_words.contains(&name)
24    }
25
26    /// Get a safe name, escaping if necessary.
27    pub fn safe_name(&self, name: &str) -> String {
28        if self.is_reserved(name) {
29            (self.escape_reserved)(name)
30        } else {
31            name.to_string()
32        }
33    }
34
35    /// Transform and make safe for use as a type name.
36    pub fn type_name(&self, name: &str) -> String {
37        let transformed = (self.command_to_type)(name);
38        self.safe_name(&transformed)
39    }
40
41    /// Transform and make safe for use as a file name.
42    pub fn file_name(&self, name: &str) -> String {
43        // File names typically don't need escaping
44        (self.command_to_file)(name)
45    }
46
47    /// Transform and make safe for use as a field name.
48    pub fn field_name(&self, name: &str) -> String {
49        let transformed = (self.field_to_name)(name);
50        self.safe_name(&transformed)
51    }
52}