Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions src/core/models/rust.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,13 @@ pub struct RustDbSetStruct {
pub comment: Option<String>,
}

#[derive(Debug, PartialEq, Default, Clone)]
pub enum Visibility {
#[default]
Private,
Public,
}

#[derive(Debug, PartialEq, Default, Clone)]
pub struct RustDbSetEnumVariant {
pub name: String,
Expand All @@ -24,6 +31,7 @@ pub struct RustDbSetEnum {

#[derive(Debug, PartialEq, Default, Clone)]
pub struct RustDbSetField {
pub field_visibility: Visibility,
pub field_name: String,
pub field_type: String,
pub is_optional: bool,
Expand Down
7 changes: 6 additions & 1 deletion src/core/translators/convert_column_to_field.rs
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
use crate::{
core::models::{
db::TableColumn,
rust::{auto_attribute, key_attribute, unique_attribute, RustDbSetField},
rust::{auto_attribute, key_attribute, unique_attribute, RustDbSetField, Visibility},
},
Mode,
};
Expand All @@ -13,6 +13,10 @@ pub fn convert_column_to_field(
column: &TableColumn,
options: ColumnToFieldOptions,
) -> Option<RustDbSetField> {
let field_visibility = match options.public_fields {
true => Visibility::Public,
false => Visibility::Private,
};
let field_name = options
.override_name
.unwrap_or(column.column_name.to_case(Case::Snake));
Expand All @@ -36,6 +40,7 @@ pub fn convert_column_to_field(

if let Some(field_type) = maybe_field_type {
return Some(RustDbSetField {
field_visibility,
field_name,
field_type,
is_optional: column.is_nullable,
Expand Down
1 change: 1 addition & 0 deletions src/core/translators/convert_table_to_struct.rs
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ pub fn convert_table_to_struct(table: Table, options: &CodegenOptions) -> RustDb

let mut column_to_field_options = column_override.or(type_override).unwrap_or_default();
column_to_field_options.mode = options.mode;
column_to_field_options.public_fields = options.public_fields;
let field = convert_column_to_field(c, column_to_field_options);
if field.is_none() {
println!("WARNING: field {} in table {} has no user-defined type or recommended type for {}", c.column_name,&table.table_name,c.udt_name)
Expand Down
4 changes: 4 additions & 0 deletions src/core/translators/convert_table_to_struct_test.rs
Original file line number Diff line number Diff line change
Expand Up @@ -324,6 +324,7 @@ fn should_convert_table_with_column_type_override() {
override_name: None,
override_type: Some("String".to_string()),
mode: Mode::Dbset,
public_fields: false,
};
let mut table_to_struct_options = CodegenOptions::default();
table_to_struct_options.set_mode(Mode::Dbset);
Expand Down Expand Up @@ -361,6 +362,7 @@ fn should_convert_table_with_global_type_override() {
override_name: None,
override_type: Some("String".to_string()),
mode: Mode::Dbset,
public_fields: false,
};
let mut table_to_struct_options = CodegenOptions::default();
table_to_struct_options.set_mode(Mode::Dbset);
Expand Down Expand Up @@ -398,11 +400,13 @@ fn column_override_takes_preference_over_global_type_override() {
override_name: None,
override_type: Some("String".to_string()),
mode: Mode::Dbset,
public_fields: false,
};
let column_override = ColumnToFieldOptions {
override_name: None,
override_type: Some("rust_decimal::Decimal".to_string()),
mode: Mode::Dbset,
public_fields: false,
};

let mut table_to_struct_options = CodegenOptions::default();
Expand Down
6 changes: 6 additions & 0 deletions src/core/translators/models.rs
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ pub struct CodegenOptions {
pub table_column_overrides: HashMap<(TableName, ColumnName), ColumnToFieldOptions>,
pub column_overrides: HashMap<ColumnName, ColumnToFieldOptions>,
pub type_overrides: HashMap<TypeName, ColumnToFieldOptions>,
pub public_fields: bool,
}

impl CodegenOptions {
Expand Down Expand Up @@ -45,6 +46,7 @@ impl CodegenOptions {
self.add_type_override(
qualifier,
ColumnToFieldOptions {
public_fields: self.public_fields,
override_name: None,
override_type: Some(override_type.to_string()),
mode: self.mode,
Expand All @@ -66,6 +68,7 @@ impl CodegenOptions {
table_name,
column_name,
ColumnToFieldOptions {
public_fields: self.public_fields,
override_name: None,
mode: self.mode,
override_type: Some(override_type.to_string()),
Expand All @@ -76,6 +79,7 @@ impl CodegenOptions {
self.add_column_override(
qualifier,
ColumnToFieldOptions {
public_fields: self.public_fields,
override_name: None,
mode: self.mode,
override_type: Some(override_type.to_string()),
Expand Down Expand Up @@ -128,6 +132,7 @@ impl CodegenOptions {
override_name: None,
override_type: Some(rust_enum.name),
mode: self.mode,
public_fields: self.public_fields,
},
);
}
Expand All @@ -139,4 +144,5 @@ pub struct ColumnToFieldOptions {
pub override_name: Option<String>,
pub override_type: Option<String>,
pub mode: Mode,
pub public_fields: bool,
}
8 changes: 6 additions & 2 deletions src/core/writers/struct_writer.rs
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
use std::fmt::Display;

use super::helpers::{get_attributes, get_derives, pretty_print_tokenstream, sanitize_field_name};
use crate::core::models::rust::{RustDbSetField, RustDbSetStruct};
use crate::core::models::rust::{RustDbSetField, RustDbSetStruct, Visibility};
use proc_macro2::TokenStream;
use quote::{format_ident, quote};

Expand All @@ -21,6 +21,10 @@ fn get_struct_fields_tokens(rust_struct: &RustDbSetStruct) -> Vec<TokenStream> {
let mut struct_fields_tokens = vec![];

for field in rust_struct.fields.iter() {
let field_visibility = match field.field_visibility {
Visibility::Public => quote! { pub },
Visibility::Private => quote! {},
};
let field_name = sanitize_field_name(&field.field_name);
//let field_type = format_ident!("{}", field.field_type);
let field_type: syn::Path =
Expand All @@ -39,7 +43,7 @@ fn get_struct_fields_tokens(rust_struct: &RustDbSetStruct) -> Vec<TokenStream> {

let field = quote! {
#attributes
#field_name: #base_type
#field_visibility #field_name: #base_type
};

struct_fields_tokens.push(field);
Expand Down
5 changes: 5 additions & 0 deletions src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,10 @@ struct Cli {
)]
table_overrides: Vec<String>,

/// Public-fields flag (if set, struct fields will be public).
#[arg(long = "public-fields")]
public_fields: bool,

/// Output .
#[arg(long, default_value = "src/models/")]
output: String,
Expand Down Expand Up @@ -144,6 +148,7 @@ async fn generate_rust_from_database(args: &Cli) -> DbSetsFsWriter {
options.add_enums(&enums);
options.set_model_derives(&args.model_derives);
options.set_enum_derives(&args.enum_derives);
options.public_fields = args.public_fields;

let structs_mapped =
translators::convert_table_to_struct::convert_tables_to_struct(tables, &options);
Expand Down
Loading