scythe_codegen/
backend_trait.rs1use scythe_core::analyzer::{AnalyzedQuery, CompositeInfo, EnumInfo};
2use scythe_core::errors::ScytheError;
3
4#[derive(Debug, Clone)]
6pub struct RbsGenerationContext {
7 pub queries: Vec<RbsQueryInfo>,
8 pub enums: Vec<RbsEnumInfo>,
9}
10
11#[derive(Debug, Clone)]
13pub struct RbsQueryInfo {
14 pub func_name: String,
15 pub struct_name: Option<String>,
16 pub columns: Vec<ResolvedColumn>,
17 pub params: Vec<ResolvedParam>,
18 pub command: scythe_core::parser::QueryCommand,
19}
20
21#[derive(Debug, Clone)]
23pub struct RbsEnumInfo {
24 pub type_name: String,
25 pub values: Vec<String>,
26}
27
28#[derive(Debug, Clone)]
30pub struct ResolvedColumn {
31 pub name: String,
32 pub field_name: String,
33 pub lang_type: String,
34 pub full_type: String,
35 pub neutral_type: String,
36 pub nullable: bool,
37}
38
39#[derive(Debug, Clone)]
41pub struct ResolvedParam {
42 pub name: String,
43 pub field_name: String,
44 pub lang_type: String,
45 pub full_type: String,
46 pub borrowed_type: String,
47 pub neutral_type: String,
48 pub nullable: bool,
49}
50
51pub trait CodegenBackend: Send + Sync {
53 fn name(&self) -> &str;
55
56 fn manifest(&self) -> &scythe_backend::manifest::BackendManifest;
58
59 fn generate_row_struct(
61 &self,
62 query_name: &str,
63 columns: &[ResolvedColumn],
64 ) -> Result<String, ScytheError>;
65
66 fn generate_model_struct(
68 &self,
69 table_name: &str,
70 columns: &[ResolvedColumn],
71 ) -> Result<String, ScytheError>;
72
73 fn generate_query_fn(
75 &self,
76 analyzed: &AnalyzedQuery,
77 struct_name: &str,
78 columns: &[ResolvedColumn],
79 params: &[ResolvedParam],
80 ) -> Result<String, ScytheError>;
81
82 fn generate_enum_def(&self, enum_info: &EnumInfo) -> Result<String, ScytheError>;
84
85 fn generate_composite_def(&self, composite: &CompositeInfo) -> Result<String, ScytheError>;
87
88 fn file_header(&self) -> String {
91 String::new()
92 }
93
94 fn file_footer(&self) -> String {
97 String::new()
98 }
99
100 fn query_class_header(&self) -> String {
106 String::new()
107 }
108
109 fn generate_rbs_file(&self, _context: &RbsGenerationContext) -> Option<String> {
112 None
113 }
114
115 fn apply_options(
118 &mut self,
119 _options: &std::collections::HashMap<String, String>,
120 ) -> Result<(), ScytheError> {
121 Ok(())
122 }
123
124 fn supported_engines(&self) -> &[&str] {
127 &["postgresql"]
128 }
129}