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}