feat(cli): implement list command
... that returns list of directory with migration
This commit is contained in:
parent
38a18180eb
commit
9fb8add4b8
2 changed files with 50 additions and 6 deletions
|
@ -1,8 +1,7 @@
|
||||||
use migra_core::path::PathBuilder;
|
use migra_core::path::PathBuilder;
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
use std::fs;
|
|
||||||
use std::io;
|
|
||||||
use std::path::{Path, PathBuf};
|
use std::path::{Path, PathBuf};
|
||||||
|
use std::{fs, io};
|
||||||
|
|
||||||
const MIGRA_TOML_FILENAME: &str = "Migra.toml";
|
const MIGRA_TOML_FILENAME: &str = "Migra.toml";
|
||||||
|
|
||||||
|
@ -57,7 +56,7 @@ impl Config {
|
||||||
Some(mut config_path) if config_path.is_dir() => {
|
Some(mut config_path) if config_path.is_dir() => {
|
||||||
config_path.push(MIGRA_TOML_FILENAME);
|
config_path.push(MIGRA_TOML_FILENAME);
|
||||||
config_path
|
config_path
|
||||||
},
|
}
|
||||||
Some(config_path) => config_path,
|
Some(config_path) => config_path,
|
||||||
None => recursive_find_config_file()?,
|
None => recursive_find_config_file()?,
|
||||||
};
|
};
|
||||||
|
@ -88,3 +87,32 @@ impl Config {
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl Config {
|
||||||
|
pub fn directory_path(&self) -> PathBuf {
|
||||||
|
PathBuilder::from(&self.root)
|
||||||
|
.append(&self.directory)
|
||||||
|
.build()
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn migration_dirs(&self) -> io::Result<Vec<PathBuf>> {
|
||||||
|
let mut entries = self
|
||||||
|
.directory_path()
|
||||||
|
.read_dir()?
|
||||||
|
.map(|res| res.map(|e| e.path()))
|
||||||
|
.collect::<Result<Vec<_>, io::Error>>()?;
|
||||||
|
|
||||||
|
entries.sort();
|
||||||
|
|
||||||
|
let migration_dir_entries = entries
|
||||||
|
.into_iter()
|
||||||
|
.filter(|entry| {
|
||||||
|
entry.is_dir()
|
||||||
|
&& PathBuilder::from(entry).append("up.sql").build().exists()
|
||||||
|
&& PathBuilder::from(entry).append("down.sql").build().exists()
|
||||||
|
})
|
||||||
|
.collect::<Vec<_>>();
|
||||||
|
|
||||||
|
Ok(migration_dir_entries)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -4,6 +4,7 @@ mod config;
|
||||||
mod opts;
|
mod opts;
|
||||||
|
|
||||||
use config::Config;
|
use config::Config;
|
||||||
|
use migra_core::path::PathBuilder;
|
||||||
use opts::{AppOpt, ApplyCommandOpt, Command, StructOpt};
|
use opts::{AppOpt, ApplyCommandOpt, Command, StructOpt};
|
||||||
use std::fs;
|
use std::fs;
|
||||||
|
|
||||||
|
@ -19,8 +20,7 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
|
||||||
|
|
||||||
let mut client = migra_core::database::connect(&config.database.connection)?;
|
let mut client = migra_core::database::connect(&config.database.connection)?;
|
||||||
|
|
||||||
let file_path = migra_core::path::PathBuilder::from(config.root)
|
let file_path = PathBuilder::from(config.directory_path())
|
||||||
.append(config.directory)
|
|
||||||
.append(file_name)
|
.append(file_name)
|
||||||
.default_extension("sql")
|
.default_extension("sql")
|
||||||
.build();
|
.build();
|
||||||
|
@ -36,7 +36,23 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Command::List | Command::Upgrade | Command::Downgrade => {
|
Command::List => {
|
||||||
|
let config = Config::read(opt.config)?;
|
||||||
|
|
||||||
|
let migration_dirs = config.migration_dirs()?;
|
||||||
|
if migration_dirs.is_empty() {
|
||||||
|
println!(
|
||||||
|
"You haven't migrations in {}",
|
||||||
|
config.directory_path().to_str().unwrap()
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
migration_dirs.iter().for_each(|dir| {
|
||||||
|
let file_name = dir.file_name().and_then(|name| name.to_str()).unwrap();
|
||||||
|
println!("{}", file_name);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Command::Upgrade | Command::Downgrade => {
|
||||||
unimplemented!();
|
unimplemented!();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Reference in a new issue