71 lines
1.8 KiB
Rust
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(())
|
|
}
|