use clap::Parser;
use config::{Config, Environment, File};
use kernel_builder::{BuilderErr, KBConfig, KernelBuilder, init_logging};
use std::path::PathBuf;
use tracing::debug;
use kernel_builder::Args;
fn main() -> Result<(), BuilderErr> {
let cli_args = Args::parse();
init_logging(cli_args.verbose);
let mut settings_path = if let Ok(xdg_env) = std::env::var("XDG_CONFIG_HOME") {
PathBuf::from(xdg_env)
} else {
PathBuf::from(std::env::var("HOME").unwrap_or_default()).join(".config")
};
settings_path.push("kernel-builder/config");
let settings = Config::builder()
.add_source(File::with_name(settings_path.to_string_lossy().as_ref()).required(false))
.add_source(Environment::with_prefix("KB"))
.build()?;
debug!("settings loaded.");
let config = settings.try_deserialize::<KBConfig>()?;
debug!("deserialized config.");
let kernel_builder = KernelBuilder::new(config)?;
debug!("setup kernel builder.");
sudo::with_env(&["XDG_", "KB_", "HOME"]).map_err(|_| BuilderErr::NoPrivileges)?;
debug!("got root permissions.");
kernel_builder.build(&cli_args)?;
debug!("finished");
Ok(())
}