You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
99 lines
2.4 KiB
Rust
99 lines
2.4 KiB
Rust
use colored::*;
|
|
use env_logger::Env;
|
|
use log::Level;
|
|
use minecraft_regions_tool::scan::ScanOptions;
|
|
use minecraft_regions_tool::world_folder::WorldFolder;
|
|
use std::path::PathBuf;
|
|
use structopt::StructOpt;
|
|
|
|
#[derive(StructOpt, Debug)]
|
|
struct Opt {
|
|
/// Path to the world folder
|
|
#[structopt(parse(from_os_str))]
|
|
input: PathBuf,
|
|
|
|
/// Forces verbose output
|
|
#[structopt(short, long)]
|
|
verbose: bool,
|
|
|
|
#[structopt(subcommand)]
|
|
sub_command: SubCommand,
|
|
}
|
|
|
|
#[derive(StructOpt, Debug)]
|
|
#[structopt()]
|
|
enum SubCommand {
|
|
/// Return the total number of chunks in the world
|
|
Count,
|
|
|
|
/// Scan for errors in the region files and optionally fix them
|
|
Scan(ScanArgs),
|
|
}
|
|
|
|
#[derive(StructOpt, Debug)]
|
|
#[structopt()]
|
|
struct ScanArgs {
|
|
/// Fixes errors that can be fixed without problems
|
|
#[structopt(short, long)]
|
|
fix: bool,
|
|
|
|
/// Deletes corrupted data
|
|
#[structopt(short, long)]
|
|
delete: bool,
|
|
}
|
|
|
|
fn main() {
|
|
let opt: Opt = Opt::from_args();
|
|
build_logger(opt.verbose);
|
|
let world = WorldFolder::new(opt.input);
|
|
match opt.sub_command {
|
|
SubCommand::Count => log::info!("Chunk Count: {}", world.count_chunks().unwrap()),
|
|
SubCommand::Scan(opt) => {
|
|
if opt.fix {
|
|
log::info!("Fixing fixable errors.");
|
|
}
|
|
log::info!("Scanning Region files for errors...");
|
|
log::info!(
|
|
"Scan Results:\n{}",
|
|
world
|
|
.scan_files(ScanOptions::new().fix(opt.fix).fix_delete(opt.delete))
|
|
.unwrap()
|
|
)
|
|
}
|
|
}
|
|
}
|
|
|
|
fn build_logger(verbose: bool) {
|
|
env_logger::Builder::from_env(Env::default().default_filter_or(if verbose {
|
|
"debug"
|
|
} else {
|
|
"info"
|
|
}))
|
|
.format(|buf, record| {
|
|
use std::io::Write;
|
|
let color = get_level_style(record.level());
|
|
writeln!(
|
|
buf,
|
|
"{}: {}",
|
|
record
|
|
.level()
|
|
.to_string()
|
|
.to_lowercase()
|
|
.as_str()
|
|
.color(color),
|
|
record.args()
|
|
)
|
|
})
|
|
.init();
|
|
}
|
|
|
|
fn get_level_style(level: Level) -> colored::Color {
|
|
match level {
|
|
Level::Trace => colored::Color::Magenta,
|
|
Level::Debug => colored::Color::Blue,
|
|
Level::Info => colored::Color::Green,
|
|
Level::Warn => colored::Color::Yellow,
|
|
Level::Error => colored::Color::Red,
|
|
}
|
|
}
|