upgr/src/main.rs

71 lines
1.8 KiB
Rust

use clap::Clap;
use miette::{miette, Context, IntoDiagnostic};
use mlua::Lua;
use std::{fs::File, io::Read, path::PathBuf, rc::Rc};
use upgr::luautil;
#[derive(Clap)]
struct Opt {
#[clap(
long,
short,
about = "Don't run interactive steps, unless they have unint_alt set"
)]
uninteractive: bool,
#[clap(
long,
short,
about = "The config file to use. Defaults to ~/.config/upgr/config.lua"
)]
config: Option<PathBuf>,
}
fn main() -> miette::Result<()> {
let opt = Opt::parse();
let cfg_path = if let Some(path) = opt.config {
path
} else {
dirs::config_dir()
.ok_or_else(|| miette!("Couldn't get home directory"))?
.join("upgr/config.lua")
};
let mut file = File::open(cfg_path)
.into_diagnostic()
.wrap_err("Couldn't open config")?;
let mut config_bytes = vec![];
file.read_to_end(&mut config_bytes)
.into_diagnostic()
.wrap_err("Failed to read config")?;
let db = Rc::new(
sled::open(
dirs::cache_dir()
.ok_or_else(|| miette!("Couldn't get cache dir"))?
.join("upgr/db"),
)
.into_diagnostic()
.wrap_err("Couldn't open database")?,
);
let lua = unsafe { Lua::unsafe_new() };
lua.globals()
.set(
"upgr",
luautil::get_obj(&lua, Rc::clone(&db)).wrap_err("Couldn't create lua upgr object")?,
)
.into_diagnostic()
.wrap_err("Couldn't set upgr lua object")?;
let config = upgr::config::run_config(&lua, &config_bytes).wrap_err("Failed to run config")?;
upgr::exec_steps(config, opt.uninteractive).wrap_err("Failed to execute steps")?;
db.flush()
.into_diagnostic()
.wrap_err("Failed to flush DB")?;
Ok(())
}