From acf79a306797b1b12e95415c340792d7c88815ab Mon Sep 17 00:00:00 2001 From: Melody Horn / boringcactus Date: Fri, 18 Jun 2021 13:42:52 -0600 Subject: lay groundwork for make-migrations --- src/cli/make_migrations.rs | 66 ++++++++++++++++++++++++++++++++++++++++++++++ src/cli/mod.rs | 3 +++ 2 files changed, 69 insertions(+) create mode 100644 src/cli/make_migrations.rs (limited to 'src/cli') diff --git a/src/cli/make_migrations.rs b/src/cli/make_migrations.rs new file mode 100644 index 0000000..767639f --- /dev/null +++ b/src/cli/make_migrations.rs @@ -0,0 +1,66 @@ +use std::collections::HashMap; + +use structopt::StructOpt; + +use crate::{Settings, UrlMap, db::backend::Connectable}; +use crate::db::migration::{Migration, DatabaseChange, CreateModelOption}; +use crate::db::models::{Field, ModelMeta}; + +#[derive(StructOpt)] +/// Generate migrations +pub struct MakeMigrations { +} + +#[derive(Debug)] +struct AppTablesState { + db: HashMap<&'static str, TableState>, +} + +#[derive(Debug)] +struct TableState { + fields: Vec, +} + +impl From<&[ModelMeta]> for AppTablesState { + fn from(models: &[ModelMeta]) -> Self { + let mut db = HashMap::new(); + for model in models { + db.insert(model.name, TableState { fields: model.fields.into() }); + } + Self { db } + } +} + +impl From<&[Migration]> for AppTablesState { + fn from(migrations: &[Migration]) -> Self { + let mut db = HashMap::new(); + for migration in migrations { + for change in migration.changes { + match change { + DatabaseChange::CreateModel { name, fields, options } => { + if db.contains_key(name) { + if options.contains(&CreateModelOption::IfNotExist) { + continue; + } else { + panic!("double-created table {}", name); + } + } + db.insert(*name, TableState { fields: (*fields).into() }); + } + } + } + } + Self { db } + } +} + +impl MakeMigrations { + pub fn execute(self, _urls: UrlMap, settings: Settings) { + for app in settings.installed_apps { + let expected_table_state = AppTablesState::from(app.models); + let actual_table_state = AppTablesState::from(app.migrations); + dbg!(expected_table_state, actual_table_state); + todo!(); + } + } +} diff --git a/src/cli/mod.rs b/src/cli/mod.rs index a11fd48..851812f 100644 --- a/src/cli/mod.rs +++ b/src/cli/mod.rs @@ -2,11 +2,13 @@ use structopt::StructOpt; use crate::{Settings, UrlMap, db::backend::Connectable}; +mod make_migrations; mod migrate; mod run_server; #[derive(StructOpt)] enum Command { + MakeMigrations(make_migrations::MakeMigrations), Migrate(migrate::Migrate), RunServer(run_server::RunServer), } @@ -14,6 +16,7 @@ enum Command { impl Command { fn execute(self, urls: UrlMap, settings: Settings) { match self { + Command::MakeMigrations(command) => command.execute(urls, settings), Command::Migrate(command) => command.execute(urls, settings), Command::RunServer(command) => command.execute(urls, settings), } -- cgit v1.2.3