work on annotate
This commit is contained in:
@@ -1,8 +0,0 @@
|
|||||||
use serde::{Deserialize, Serialize};
|
|
||||||
|
|
||||||
#[derive(Deserialize, Serialize, Debug, Clone)]
|
|
||||||
pub struct DbConfig {
|
|
||||||
pub database_schema: Option<String>,
|
|
||||||
pub max_connections: u32,
|
|
||||||
pub acquire_timeout: u64,
|
|
||||||
}
|
|
||||||
@@ -1,86 +0,0 @@
|
|||||||
pub mod db;
|
|
||||||
pub mod output;
|
|
||||||
pub mod sea_orm_config;
|
|
||||||
pub mod template;
|
|
||||||
|
|
||||||
use std::path::PathBuf;
|
|
||||||
|
|
||||||
use db::DbConfig;
|
|
||||||
use output::{OutputCommentConfig, OutputConfig, OutputModelConfig};
|
|
||||||
use sea_orm_config::{
|
|
||||||
DateTimeCrate, EntityFormat, Prelude, SeaOrmConfig, SeaOrmEntityConfig,
|
|
||||||
SeaOrmExtraAttributesConfig, SeaOrmExtraDerivesConfig, SeaOrmSerdeConfig, SeaOrmTableConfig,
|
|
||||||
SerdeEnable,
|
|
||||||
};
|
|
||||||
use serde::{Deserialize, Serialize};
|
|
||||||
use serde_yaml::Mapping;
|
|
||||||
|
|
||||||
#[derive(Deserialize, Serialize, Debug, Clone)]
|
|
||||||
pub struct Config {
|
|
||||||
pub db: DbConfig,
|
|
||||||
pub sea_orm: SeaOrmConfig,
|
|
||||||
pub output: OutputConfig,
|
|
||||||
pub templates: Option<Mapping>,
|
|
||||||
pub templates_dir: Option<PathBuf>,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Default for Config {
|
|
||||||
fn default() -> Self {
|
|
||||||
Self {
|
|
||||||
db: DbConfig {
|
|
||||||
database_schema: None,
|
|
||||||
max_connections: 10,
|
|
||||||
acquire_timeout: 5,
|
|
||||||
},
|
|
||||||
sea_orm: SeaOrmConfig {
|
|
||||||
prelude: Prelude::Enabled,
|
|
||||||
serde: SeaOrmSerdeConfig {
|
|
||||||
enable: SerdeEnable::None,
|
|
||||||
skip_deserializing_primary_key: false,
|
|
||||||
skip_hidden_column: false,
|
|
||||||
},
|
|
||||||
entity: SeaOrmEntityConfig {
|
|
||||||
format: EntityFormat::Compact,
|
|
||||||
tables: SeaOrmTableConfig {
|
|
||||||
include_hidden: false,
|
|
||||||
skip_seaql_migrations: true,
|
|
||||||
table_config: None,
|
|
||||||
},
|
|
||||||
extra_derives: SeaOrmExtraDerivesConfig {
|
|
||||||
model: Vec::new(),
|
|
||||||
eenum: Vec::new(),
|
|
||||||
},
|
|
||||||
extra_attributes: SeaOrmExtraAttributesConfig {
|
|
||||||
model: Vec::new(),
|
|
||||||
eenum: Vec::new(),
|
|
||||||
},
|
|
||||||
date_time_crate: DateTimeCrate::Chrono,
|
|
||||||
with_copy_enums: false,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
output: OutputConfig {
|
|
||||||
path: PathBuf::from("./src/"),
|
|
||||||
models: OutputModelConfig {
|
|
||||||
comment: OutputCommentConfig {
|
|
||||||
max_width: None,
|
|
||||||
table_name: true,
|
|
||||||
column_name: true,
|
|
||||||
column_db_type: true,
|
|
||||||
column_rust_type: true,
|
|
||||||
column_attributes: true,
|
|
||||||
column_exclude_attributes: Vec::new(),
|
|
||||||
enable: true,
|
|
||||||
column_info: true,
|
|
||||||
ignore_errors: false,
|
|
||||||
},
|
|
||||||
enable: true,
|
|
||||||
entities: String::from("_entities"),
|
|
||||||
prelude: true,
|
|
||||||
path: PathBuf::from("./models"),
|
|
||||||
},
|
|
||||||
},
|
|
||||||
templates: None,
|
|
||||||
templates_dir: None,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,32 +0,0 @@
|
|||||||
use std::path::PathBuf;
|
|
||||||
|
|
||||||
use serde::{Deserialize, Serialize};
|
|
||||||
|
|
||||||
#[derive(Deserialize, Serialize, Debug, Clone)]
|
|
||||||
pub struct OutputConfig {
|
|
||||||
pub path: PathBuf,
|
|
||||||
pub models: OutputModelConfig,
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Deserialize, Serialize, Debug, Clone)]
|
|
||||||
pub struct OutputModelConfig {
|
|
||||||
pub prelude: bool,
|
|
||||||
pub enable: bool,
|
|
||||||
pub path: PathBuf,
|
|
||||||
pub comment: OutputCommentConfig,
|
|
||||||
pub entities: String,
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Deserialize, Serialize, Debug, Clone)]
|
|
||||||
pub struct OutputCommentConfig {
|
|
||||||
pub enable: bool,
|
|
||||||
pub max_width: Option<u16>,
|
|
||||||
pub table_name: bool,
|
|
||||||
pub column_info: bool,
|
|
||||||
pub column_name: bool,
|
|
||||||
pub column_db_type: bool,
|
|
||||||
pub column_rust_type: bool,
|
|
||||||
pub column_attributes: bool,
|
|
||||||
pub column_exclude_attributes: Vec<String>,
|
|
||||||
pub ignore_errors: bool,
|
|
||||||
}
|
|
||||||
@@ -1,233 +0,0 @@
|
|||||||
use serde::{Deserialize, Deserializer, Serialize};
|
|
||||||
use serde_yaml::Value;
|
|
||||||
|
|
||||||
use sea_orm_codegen::{
|
|
||||||
DateTimeCrate as CodegenDateTimeCrate, EntityWriterContext, WithPrelude, WithSerde,
|
|
||||||
};
|
|
||||||
|
|
||||||
use super::Config;
|
|
||||||
#[derive(Debug, Clone, Serialize, Deserialize)]
|
|
||||||
#[serde(rename_all = "lowercase")]
|
|
||||||
pub enum EntityFormat {
|
|
||||||
Expanded,
|
|
||||||
Compact,
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Debug, Clone, Serialize, Deserialize)]
|
|
||||||
#[serde(rename_all = "snake_case")]
|
|
||||||
#[serde(untagged)]
|
|
||||||
pub enum TableConfig {
|
|
||||||
Specific { specific: Vec<String> },
|
|
||||||
Exclude { exclude: Vec<String> },
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Debug, Clone)]
|
|
||||||
pub enum SerdeEnable {
|
|
||||||
Both,
|
|
||||||
Serialize,
|
|
||||||
Deserialize,
|
|
||||||
None,
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Debug, Clone)]
|
|
||||||
pub enum Prelude {
|
|
||||||
Enabled,
|
|
||||||
Disabled,
|
|
||||||
AllowUnusedImports,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<'de> Deserialize<'de> for SerdeEnable {
|
|
||||||
fn deserialize<D>(deserializer: D) -> Result<SerdeEnable, D::Error>
|
|
||||||
where
|
|
||||||
D: Deserializer<'de>,
|
|
||||||
{
|
|
||||||
let value = Value::deserialize(deserializer)?;
|
|
||||||
|
|
||||||
match value {
|
|
||||||
Value::String(s) if s == "serialize" => Ok(SerdeEnable::Serialize),
|
|
||||||
Value::String(s) if s == "deserialize" => Ok(SerdeEnable::Deserialize),
|
|
||||||
Value::Bool(true) => Ok(SerdeEnable::Both),
|
|
||||||
Value::Bool(false) => Ok(SerdeEnable::None),
|
|
||||||
_ => Err(serde::de::Error::custom(
|
|
||||||
"expected 'serialize', 'deserialize', 'true' or 'false'",
|
|
||||||
)),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
impl Serialize for SerdeEnable {
|
|
||||||
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
|
|
||||||
where
|
|
||||||
S: serde::Serializer,
|
|
||||||
{
|
|
||||||
match self {
|
|
||||||
SerdeEnable::Both => serializer.serialize_bool(true),
|
|
||||||
SerdeEnable::Serialize => serializer.serialize_str("serialize"),
|
|
||||||
SerdeEnable::Deserialize => serializer.serialize_str("deserialize"),
|
|
||||||
SerdeEnable::None => serializer.serialize_bool(false),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
impl<'de> Deserialize<'de> for Prelude {
|
|
||||||
fn deserialize<D>(deserializer: D) -> Result<Prelude, D::Error>
|
|
||||||
where
|
|
||||||
D: Deserializer<'de>,
|
|
||||||
{
|
|
||||||
let value = Value::deserialize(deserializer)?;
|
|
||||||
|
|
||||||
match value {
|
|
||||||
Value::Bool(true) => Ok(Prelude::Enabled),
|
|
||||||
Value::Bool(false) => Ok(Prelude::Disabled),
|
|
||||||
Value::String(s) if s == "allow_unused_imports" => Ok(Prelude::AllowUnusedImports),
|
|
||||||
_ => Err(serde::de::Error::custom(
|
|
||||||
"expected 'true', 'false', or 'allow_unused_imports'",
|
|
||||||
)),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
impl Serialize for Prelude {
|
|
||||||
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
|
|
||||||
where
|
|
||||||
S: serde::Serializer,
|
|
||||||
{
|
|
||||||
match self {
|
|
||||||
Prelude::Enabled => serializer.serialize_bool(true),
|
|
||||||
Prelude::Disabled => serializer.serialize_bool(false),
|
|
||||||
Prelude::AllowUnusedImports => serializer.serialize_str("allow_unused_imports"),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#[derive(Deserialize, Serialize, Debug, Clone)]
|
|
||||||
pub struct SeaOrmConfig {
|
|
||||||
pub prelude: Prelude,
|
|
||||||
pub serde: SeaOrmSerdeConfig,
|
|
||||||
pub entity: SeaOrmEntityConfig,
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Deserialize, Serialize, Debug, Clone)]
|
|
||||||
pub struct SeaOrmSerdeConfig {
|
|
||||||
pub enable: SerdeEnable,
|
|
||||||
pub skip_deserializing_primary_key: bool,
|
|
||||||
pub skip_hidden_column: bool,
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Deserialize, Serialize, Debug, Clone)]
|
|
||||||
pub struct SeaOrmEntityConfig {
|
|
||||||
pub format: EntityFormat,
|
|
||||||
pub tables: SeaOrmTableConfig,
|
|
||||||
pub extra_derives: SeaOrmExtraDerivesConfig,
|
|
||||||
pub extra_attributes: SeaOrmExtraAttributesConfig,
|
|
||||||
pub date_time_crate: DateTimeCrate,
|
|
||||||
pub with_copy_enums: bool,
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Deserialize, Serialize, Debug, Clone)]
|
|
||||||
pub struct SeaOrmTableConfig {
|
|
||||||
pub include_hidden: bool,
|
|
||||||
pub skip_seaql_migrations: bool,
|
|
||||||
#[serde(flatten)]
|
|
||||||
pub table_config: Option<TableConfig>,
|
|
||||||
}
|
|
||||||
#[derive(Deserialize, Serialize, Debug, Clone)]
|
|
||||||
pub struct SeaOrmExtraDerivesConfig {
|
|
||||||
pub model: Vec<String>,
|
|
||||||
#[serde(rename = "enum")]
|
|
||||||
pub eenum: Vec<String>,
|
|
||||||
}
|
|
||||||
#[derive(Deserialize, Serialize, Debug, Clone)]
|
|
||||||
pub struct SeaOrmExtraAttributesConfig {
|
|
||||||
pub model: Vec<String>,
|
|
||||||
#[serde(rename = "enum")]
|
|
||||||
pub eenum: Vec<String>,
|
|
||||||
}
|
|
||||||
#[derive(Deserialize, Serialize, Debug, Clone)]
|
|
||||||
#[serde(rename_all = "lowercase")]
|
|
||||||
pub enum DateTimeCrate {
|
|
||||||
Time,
|
|
||||||
Chrono,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl From<DateTimeCrate> for CodegenDateTimeCrate {
|
|
||||||
fn from(date_time_crate: DateTimeCrate) -> CodegenDateTimeCrate {
|
|
||||||
match date_time_crate {
|
|
||||||
DateTimeCrate::Chrono => CodegenDateTimeCrate::Chrono,
|
|
||||||
DateTimeCrate::Time => CodegenDateTimeCrate::Time,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl SeaOrmTableConfig {
|
|
||||||
pub fn get_filter(&self) -> Box<dyn Fn(&String) -> bool> {
|
|
||||||
let include_hidden = self.include_hidden;
|
|
||||||
if let Some(table) = &self.table_config {
|
|
||||||
match table {
|
|
||||||
TableConfig::Specific { specific } => {
|
|
||||||
let specific = specific.clone();
|
|
||||||
Box::new(move |table: &String| {
|
|
||||||
(include_hidden || !table.starts_with('_')) && specific.contains(table)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
TableConfig::Exclude { exclude } => {
|
|
||||||
let exclude = exclude.clone();
|
|
||||||
Box::new(move |table: &String| {
|
|
||||||
(include_hidden || !table.starts_with('_')) && !exclude.contains(table)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else if self.skip_seaql_migrations {
|
|
||||||
Box::new(move |table: &String| {
|
|
||||||
(include_hidden || !table.starts_with('_'))
|
|
||||||
&& !table.starts_with("seaql_migrations")
|
|
||||||
})
|
|
||||||
} else {
|
|
||||||
Box::new(move |table: &String| (include_hidden || !table.starts_with('_')))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl EntityFormat {
|
|
||||||
pub fn is_expanded(&self) -> bool {
|
|
||||||
matches!(self, EntityFormat::Expanded)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
impl From<Prelude> for WithPrelude {
|
|
||||||
fn from(val: Prelude) -> Self {
|
|
||||||
match val {
|
|
||||||
Prelude::Enabled => WithPrelude::All,
|
|
||||||
|
|
||||||
Prelude::Disabled => WithPrelude::None,
|
|
||||||
Prelude::AllowUnusedImports => WithPrelude::AllAllowUnusedImports,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
impl From<SerdeEnable> for WithSerde {
|
|
||||||
fn from(val: SerdeEnable) -> Self {
|
|
||||||
match val {
|
|
||||||
SerdeEnable::Both => WithSerde::Both,
|
|
||||||
SerdeEnable::Serialize => WithSerde::Serialize,
|
|
||||||
SerdeEnable::Deserialize => WithSerde::Deserialize,
|
|
||||||
SerdeEnable::None => WithSerde::None,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl From<Config> for EntityWriterContext {
|
|
||||||
fn from(val: Config) -> Self {
|
|
||||||
EntityWriterContext::new(
|
|
||||||
val.sea_orm.entity.format.is_expanded(),
|
|
||||||
val.sea_orm.prelude.into(),
|
|
||||||
val.sea_orm.serde.enable.into(),
|
|
||||||
val.sea_orm.entity.with_copy_enums,
|
|
||||||
val.sea_orm.entity.date_time_crate.into(),
|
|
||||||
val.db.database_schema,
|
|
||||||
false,
|
|
||||||
val.sea_orm.serde.skip_deserializing_primary_key,
|
|
||||||
val.sea_orm.serde.skip_hidden_column,
|
|
||||||
val.sea_orm.entity.extra_derives.model,
|
|
||||||
val.sea_orm.entity.extra_attributes.model,
|
|
||||||
val.sea_orm.entity.extra_derives.eenum,
|
|
||||||
val.sea_orm.entity.extra_attributes.eenum,
|
|
||||||
false,
|
|
||||||
false,
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
|
|
||||||
101
src/generator/modules/annotate/comment.rs
Normal file
101
src/generator/modules/annotate/comment.rs
Normal file
@@ -0,0 +1,101 @@
|
|||||||
|
use color_eyre::Result;
|
||||||
|
use minijinja::Environment;
|
||||||
|
|
||||||
|
use crate::generator::modules::{
|
||||||
|
discovery::{db::DbType, table::Table},
|
||||||
|
sea_orm::config::DateTimeCrate,
|
||||||
|
};
|
||||||
|
use comfy_table::{Cell, ContentArrangement, Table as CTable};
|
||||||
|
|
||||||
|
use super::{AnnotateCommentConfig, COMMENTBODY, COMMENTHEAD, COMMENTTAIL};
|
||||||
|
pub fn generate_comment(
|
||||||
|
table: &Table,
|
||||||
|
config: &AnnotateCommentConfig,
|
||||||
|
environment: &Environment<'static>,
|
||||||
|
db_type: &DbType,
|
||||||
|
date_time_crate: &DateTimeCrate,
|
||||||
|
) -> Result<String> {
|
||||||
|
let mut column_info_table = CTable::new();
|
||||||
|
let mut header = Vec::new();
|
||||||
|
if config.column_name.unwrap() {
|
||||||
|
header.push("Name");
|
||||||
|
}
|
||||||
|
if config.column_db_type.unwrap() {
|
||||||
|
header.push("DbType");
|
||||||
|
}
|
||||||
|
if config.column_rust_type.unwrap() {
|
||||||
|
header.push("RsType");
|
||||||
|
}
|
||||||
|
if config.column_attributes.unwrap() {
|
||||||
|
header.push("Attrs");
|
||||||
|
}
|
||||||
|
column_info_table
|
||||||
|
.load_preset(" -+=++ + ++")
|
||||||
|
.set_content_arrangement(ContentArrangement::Dynamic)
|
||||||
|
.set_header(header);
|
||||||
|
if let Some(width) = config.max_wdith {
|
||||||
|
column_info_table.set_width(width);
|
||||||
|
}
|
||||||
|
for column in &table.columns {
|
||||||
|
let mut row = Vec::new();
|
||||||
|
if config.column_name.unwrap() {
|
||||||
|
row.push(Cell::new(column.name.clone()))
|
||||||
|
}
|
||||||
|
if config.column_db_type.unwrap() {
|
||||||
|
let column_type = column.get_db_type(db_type);
|
||||||
|
row.push(Cell::new(column_type));
|
||||||
|
}
|
||||||
|
if config.column_rust_type.unwrap() {
|
||||||
|
let column_type = column.get_rust_type(date_time_crate);
|
||||||
|
row.push(Cell::new(column_type));
|
||||||
|
}
|
||||||
|
if config.column_attributes.unwrap() {
|
||||||
|
let attrs_string = column.attrs_to_string();
|
||||||
|
row.push(Cell::new(attrs_string));
|
||||||
|
}
|
||||||
|
column_info_table.add_row(row);
|
||||||
|
}
|
||||||
|
// column_info_table.to_string()
|
||||||
|
// let config_part = match parsed_settings {
|
||||||
|
// Some(settings) => {
|
||||||
|
// let settings_str = serde_yaml::to_string(&settings)?;
|
||||||
|
// let settings_str = settings_str
|
||||||
|
// .lines()
|
||||||
|
// .map(|line| format!(" {}", line))
|
||||||
|
// .collect::<Vec<_>>()
|
||||||
|
// .join("\n");
|
||||||
|
// format!(
|
||||||
|
// "{SETTINGSDELIMITER}\n{}\n{SETTINGSDELIMITER}\n\n",
|
||||||
|
// settings_str
|
||||||
|
// )
|
||||||
|
// }
|
||||||
|
// None => String::new(),
|
||||||
|
// };
|
||||||
|
|
||||||
|
// let table_name = &table.name;
|
||||||
|
// let table_name_str = if config.table_name {
|
||||||
|
// format!("Table: {}\n", table_name)
|
||||||
|
// } else {
|
||||||
|
// String::new()
|
||||||
|
// };
|
||||||
|
// let string = format!("{HEADER}\n{config_part}{table_name_str}\n{column_info_table}");
|
||||||
|
|
||||||
|
// let padded_string = Self::pad_comment(&string);
|
||||||
|
Ok(String::new())
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn pad_comment(s: &str) -> String {
|
||||||
|
let parts = s.split('\n').collect::<Vec<_>>();
|
||||||
|
let mut padded = String::new();
|
||||||
|
for (index, part) in parts.iter().enumerate() {
|
||||||
|
let first = index == 0;
|
||||||
|
let comment = match first {
|
||||||
|
true => COMMENTHEAD.to_string(),
|
||||||
|
false => COMMENTBODY.to_string(),
|
||||||
|
};
|
||||||
|
let padded_part = format!("{} {}\n", comment, part);
|
||||||
|
padded.push_str(&padded_part);
|
||||||
|
}
|
||||||
|
padded.push_str(COMMENTTAIL);
|
||||||
|
padded
|
||||||
|
}
|
||||||
@@ -1,21 +1,55 @@
|
|||||||
use super::{discovery::DiscoveredSchema, models::ModelsConfig, Module, ModulesContext};
|
pub mod comment;
|
||||||
|
|
||||||
|
use super::{
|
||||||
|
discovery::DiscoveredSchema, models::ModelsConfig, sea_orm::SeaOrmConfig, Module,
|
||||||
|
ModulesContext,
|
||||||
|
};
|
||||||
use color_eyre::Result;
|
use color_eyre::Result;
|
||||||
use minijinja::Environment;
|
use minijinja::Environment;
|
||||||
use serde::Deserialize;
|
use serde::{Deserialize, Serialize};
|
||||||
const HEADER: &str = r#"== Schema Information"#;
|
const HEADER: &str = r#"== Schema Information"#;
|
||||||
const COMMENTHEAD: &str = r#"/*"#;
|
const COMMENTHEAD: &str = r#"/*"#;
|
||||||
const COMMENTBODY: &str = r#" *"#;
|
const COMMENTBODY: &str = r#" *"#;
|
||||||
const COMMENTTAIL: &str = r#"*/"#;
|
const COMMENTTAIL: &str = r#"*/"#;
|
||||||
const SETTINGSDELIMITER: &str = r#"```"#;
|
const SETTINGSDELIMITER: &str = r#"```"#;
|
||||||
|
|
||||||
#[derive(Debug, Clone, Deserialize)]
|
#[derive(Debug, Clone, Deserialize)]
|
||||||
#[serde(default)]
|
#[serde(default)]
|
||||||
|
#[derive(Default)]
|
||||||
pub struct AnnotateConfig {
|
pub struct AnnotateConfig {
|
||||||
pub enable: bool,
|
pub enable: bool,
|
||||||
|
pub comment: AnnotateCommentConfig,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Default for AnnotateConfig {
|
#[derive(Debug, Clone, Deserialize, Serialize)]
|
||||||
|
pub struct AnnotateCommentConfig {
|
||||||
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
|
pub max_wdith: Option<u16>,
|
||||||
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
|
pub table_name: Option<bool>,
|
||||||
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
|
pub column_name: Option<bool>,
|
||||||
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
|
pub column_db_type: Option<bool>,
|
||||||
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
|
pub column_rust_type: Option<bool>,
|
||||||
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
|
pub column_attributes: Option<bool>,
|
||||||
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
|
pub column_exclude_attributes: Option<Vec<String>>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Default for AnnotateCommentConfig {
|
||||||
fn default() -> Self {
|
fn default() -> Self {
|
||||||
Self { enable: false }
|
Self {
|
||||||
|
max_wdith: Some(80),
|
||||||
|
table_name: Some(true),
|
||||||
|
column_name: Some(true),
|
||||||
|
column_db_type: Some(true),
|
||||||
|
column_rust_type: Some(true),
|
||||||
|
column_attributes: Some(true),
|
||||||
|
column_exclude_attributes: Some(vec![]),
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -39,12 +73,35 @@ impl Module for AnnotateModule {
|
|||||||
}
|
}
|
||||||
async fn execute(&mut self, ctx: &mut ModulesContext) -> Result<()> {
|
async fn execute(&mut self, ctx: &mut ModulesContext) -> Result<()> {
|
||||||
let map = ctx.get_anymap();
|
let map = ctx.get_anymap();
|
||||||
|
let file_manager = ctx.get_file_manager();
|
||||||
if let (Some(config), Some(environment), Some(schema)) = (
|
if let (Some(config), Some(environment), Some(schema)) = (
|
||||||
map.get::<AnnotateConfig>(),
|
map.get::<AnnotateConfig>(),
|
||||||
map.get::<Environment<'static>>(),
|
map.get::<Environment<'static>>(),
|
||||||
map.get::<DiscoveredSchema>(),
|
map.get::<DiscoveredSchema>(),
|
||||||
) {
|
) {
|
||||||
|
if let (Some(models_config), Some(sea_orm_config)) =
|
||||||
|
(map.get::<ModelsConfig>(), map.get::<SeaOrmConfig>())
|
||||||
|
{
|
||||||
|
if models_config.enable {
|
||||||
|
let path = models_config.path.clone().unwrap();
|
||||||
|
for table in &schema.tables {
|
||||||
|
let path = path.join(format!("{}.rs", table.name));
|
||||||
|
let content = file_manager.get(&path);
|
||||||
|
if content.is_some() {
|
||||||
|
// generate default comment and insert
|
||||||
|
let comment = comment::generate_comment(
|
||||||
|
table,
|
||||||
|
&config.comment,
|
||||||
|
environment,
|
||||||
|
&schema.database_type,
|
||||||
|
&sea_orm_config.entity.date_time_crate,
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
// file must already exist therefor read and process it
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Ok(())
|
Ok(())
|
||||||
} else {
|
} else {
|
||||||
Ok(())
|
Ok(())
|
||||||
|
|||||||
@@ -174,7 +174,7 @@ impl Column {
|
|||||||
}
|
}
|
||||||
write_db_type(&self.col_type, db_type)
|
write_db_type(&self.col_type, db_type)
|
||||||
}
|
}
|
||||||
pub fn get_rs_type(&self, date_time_crate: &DateTimeCrate) -> String {
|
pub fn get_rust_type(&self, date_time_crate: &DateTimeCrate) -> String {
|
||||||
fn write_rs_type(col_type: &ColumnType, date_time_crate: &DateTimeCrate) -> String {
|
fn write_rs_type(col_type: &ColumnType, date_time_crate: &DateTimeCrate) -> String {
|
||||||
#[allow(unreachable_patterns)]
|
#[allow(unreachable_patterns)]
|
||||||
match col_type {
|
match col_type {
|
||||||
|
|||||||
@@ -83,7 +83,10 @@ impl ModulesContext {
|
|||||||
pub fn get_anymap_mut(&mut self) -> &mut AnyCloneMap {
|
pub fn get_anymap_mut(&mut self) -> &mut AnyCloneMap {
|
||||||
&mut self.anymap
|
&mut self.anymap
|
||||||
}
|
}
|
||||||
pub fn get_file_manager(&mut self) -> &mut FileManager {
|
pub fn get_file_manager(&self) -> &FileManager {
|
||||||
|
&self.file_manager
|
||||||
|
}
|
||||||
|
pub fn get_file_manager_mut(&mut self) -> &mut FileManager {
|
||||||
&mut self.file_manager
|
&mut self.file_manager
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -169,7 +169,7 @@ impl Module for ModelsModule {
|
|||||||
// One or both keys are missing
|
// One or both keys are missing
|
||||||
}
|
}
|
||||||
tracing::info!(?files, "Generated model files");
|
tracing::info!(?files, "Generated model files");
|
||||||
let file_manager = ctx.get_file_manager();
|
let file_manager = ctx.get_file_manager_mut();
|
||||||
for (output_path, content) in files {
|
for (output_path, content) in files {
|
||||||
file_manager.insert(&output_path, &content, None)?;
|
file_manager.insert(&output_path, &content, None)?;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -98,7 +98,7 @@ impl Module for SeaOrmModule {
|
|||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
|
|
||||||
let file_manager = ctx.get_file_manager();
|
let file_manager = ctx.get_file_manager_mut();
|
||||||
for (output_path, content) in outputs {
|
for (output_path, content) in outputs {
|
||||||
file_manager.insert(&output_path, &content, None)?;
|
file_manager.insert(&output_path, &content, None)?;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user