use quote::format_ident;
use super::helpers::join_columns;
use crate::entity::parse::{DatabaseDialect, EntityDef, ReturningMode};
pub struct Context<'a> {
pub entity: &'a EntityDef,
pub dialect: DatabaseDialect,
pub trait_name: syn::Ident,
pub entity_name: &'a syn::Ident,
pub row_name: syn::Ident,
pub insertable_name: syn::Ident,
pub create_dto: syn::Ident,
pub update_dto: syn::Ident,
pub table: String,
pub id_name: &'a syn::Ident,
pub id_type: &'a syn::Type,
pub columns_str: String,
pub placeholders_str: String,
pub soft_delete: bool,
pub returning: ReturningMode,
pub streams: bool
}
impl<'a> Context<'a> {
pub fn new(entity: &'a EntityDef) -> Self {
let id_field = entity.id_field();
let fields = entity.all_fields();
let dialect = entity.dialect;
Self {
entity,
dialect,
trait_name: format_ident!("{}Repository", entity.name()),
entity_name: entity.name(),
row_name: entity.ident_with("", "Row"),
insertable_name: entity.ident_with("Insertable", ""),
create_dto: entity.ident_with("Create", "Request"),
update_dto: entity.ident_with("Update", "Request"),
table: entity.full_table_name(),
id_name: id_field.name(),
id_type: id_field.ty(),
columns_str: join_columns(fields),
placeholders_str: dialect.placeholders(fields.len()),
soft_delete: entity.is_soft_delete(),
returning: entity.returning.clone(),
streams: entity.has_streams()
}
}
}