Skip to main content

scythe_codegen/
backend_trait.rs

1use scythe_core::analyzer::{AnalyzedQuery, CompositeInfo, EnumInfo};
2use scythe_core::errors::ScytheError;
3
4/// A column with its type resolved to the target language.
5#[derive(Debug, Clone)]
6pub struct ResolvedColumn {
7    pub name: String,
8    pub field_name: String,
9    pub lang_type: String,
10    pub full_type: String,
11    pub neutral_type: String,
12    pub nullable: bool,
13}
14
15/// A parameter with its type resolved to the target language.
16#[derive(Debug, Clone)]
17pub struct ResolvedParam {
18    pub name: String,
19    pub field_name: String,
20    pub lang_type: String,
21    pub full_type: String,
22    pub borrowed_type: String,
23    pub neutral_type: String,
24    pub nullable: bool,
25}
26
27/// Trait that all codegen backends must implement.
28pub trait CodegenBackend: Send + Sync {
29    /// The backend's name (e.g. "rust-sqlx", "rust-tokio-postgres").
30    fn name(&self) -> &str;
31
32    /// Generate a row struct for a query result.
33    fn generate_row_struct(
34        &self,
35        query_name: &str,
36        columns: &[ResolvedColumn],
37    ) -> Result<String, ScytheError>;
38
39    /// Generate a model struct for a table.
40    fn generate_model_struct(
41        &self,
42        table_name: &str,
43        columns: &[ResolvedColumn],
44    ) -> Result<String, ScytheError>;
45
46    /// Generate a query function.
47    fn generate_query_fn(
48        &self,
49        analyzed: &AnalyzedQuery,
50        struct_name: &str,
51        columns: &[ResolvedColumn],
52        params: &[ResolvedParam],
53    ) -> Result<String, ScytheError>;
54
55    /// Generate an enum definition.
56    fn generate_enum_def(&self, enum_info: &EnumInfo) -> Result<String, ScytheError>;
57
58    /// Generate a composite type definition.
59    fn generate_composite_def(&self, composite: &CompositeInfo) -> Result<String, ScytheError>;
60
61    /// Generate a file-level header (imports, docstring, etc).
62    /// Returns an empty string by default; backends may override.
63    fn file_header(&self) -> String {
64        String::new()
65    }
66}