feat(cli): implement make migration command
chore(deps): add chrono crate
This commit is contained in:
parent
9fb8add4b8
commit
9d3d44dfa1
3 changed files with 45 additions and 1 deletions
|
@ -14,3 +14,4 @@ migra-core = { path = '../migra-core' }
|
||||||
structopt = "0.3"
|
structopt = "0.3"
|
||||||
serde = { version = "1.0", features = ["derive"] }
|
serde = { version = "1.0", features = ["derive"] }
|
||||||
toml = "0.5"
|
toml = "0.5"
|
||||||
|
chrono = "0.4.19"
|
||||||
|
|
|
@ -3,9 +3,10 @@
|
||||||
mod config;
|
mod config;
|
||||||
mod opts;
|
mod opts;
|
||||||
|
|
||||||
|
use chrono::Local;
|
||||||
use config::Config;
|
use config::Config;
|
||||||
use migra_core::path::PathBuilder;
|
use migra_core::path::PathBuilder;
|
||||||
use opts::{AppOpt, ApplyCommandOpt, Command, StructOpt};
|
use opts::{AppOpt, ApplyCommandOpt, Command, MakeCommandOpt, StructOpt};
|
||||||
use std::fs;
|
use std::fs;
|
||||||
|
|
||||||
fn main() -> Result<(), Box<dyn std::error::Error>> {
|
fn main() -> Result<(), Box<dyn std::error::Error>> {
|
||||||
|
@ -36,6 +37,40 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Command::Make(MakeCommandOpt { migration_name }) => {
|
||||||
|
let config = Config::read(opt.config)?;
|
||||||
|
|
||||||
|
let now = Local::now().format("%y%m%d%H%M%S");
|
||||||
|
|
||||||
|
let migration_name: String = migration_name
|
||||||
|
.to_lowercase()
|
||||||
|
.chars()
|
||||||
|
.map(|c| match c {
|
||||||
|
'0'..='9' | 'a'..='z' => c,
|
||||||
|
_ => '_',
|
||||||
|
})
|
||||||
|
.collect();
|
||||||
|
|
||||||
|
let new_dir_path = PathBuilder::from(config.directory_path())
|
||||||
|
.append(format!("{}_{}", now, migration_name))
|
||||||
|
.build();
|
||||||
|
if !new_dir_path.exists() {
|
||||||
|
fs::create_dir(&new_dir_path)?;
|
||||||
|
}
|
||||||
|
|
||||||
|
let upgrade_migration_path = PathBuilder::from(&new_dir_path).append("up.sql").build();
|
||||||
|
if !upgrade_migration_path.exists() {
|
||||||
|
fs::write(upgrade_migration_path, "-- Your SQL goes here\n\n")?;
|
||||||
|
}
|
||||||
|
|
||||||
|
let down_migration_path = PathBuilder::from(&new_dir_path).append("down.sql").build();
|
||||||
|
if !down_migration_path.exists() {
|
||||||
|
fs::write(
|
||||||
|
down_migration_path,
|
||||||
|
"-- This file should undo anything in `up.sql`\n\n",
|
||||||
|
)?;
|
||||||
|
}
|
||||||
|
}
|
||||||
Command::List => {
|
Command::List => {
|
||||||
let config = Config::read(opt.config)?;
|
let config = Config::read(opt.config)?;
|
||||||
|
|
||||||
|
|
|
@ -17,6 +17,8 @@ pub(crate) enum Command {
|
||||||
|
|
||||||
Apply(ApplyCommandOpt),
|
Apply(ApplyCommandOpt),
|
||||||
|
|
||||||
|
Make(MakeCommandOpt),
|
||||||
|
|
||||||
#[structopt(name = "list", visible_alias = "ls")]
|
#[structopt(name = "list", visible_alias = "ls")]
|
||||||
List,
|
List,
|
||||||
|
|
||||||
|
@ -32,3 +34,9 @@ pub(crate) struct ApplyCommandOpt {
|
||||||
#[structopt(parse(from_str))]
|
#[structopt(parse(from_str))]
|
||||||
pub file_name: String,
|
pub file_name: String,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, StructOpt)]
|
||||||
|
pub(crate) struct MakeCommandOpt {
|
||||||
|
#[structopt(parse(from_str))]
|
||||||
|
pub migration_name: String,
|
||||||
|
}
|
||||||
|
|
Reference in a new issue