use clap::Parser;
use env_logger::Builder;
use log::{Level, LevelFilter};
use nuts_backend::Backend;
use std::io::Write;
use crate::bson::BsonError;
use crate::plugin::cli::{PluginCli, PluginCommand};
use crate::plugin::handler::{InfoHandler, OpenCreateHandler, PluginHandler};
pub struct PluginRunner<B: Backend, T: PluginHandler<B>> {
cli: PluginCli<T::CreateArgs>,
handler: T,
}
impl<B: Backend, T: PluginHandler<B>> PluginRunner<B, T> {
pub fn new(handler: T) -> PluginRunner<B, T> {
PluginRunner {
cli: PluginCli::parse(),
handler,
}
}
pub fn configure_logging(&mut self) -> &mut Self {
let mut builder = Builder::new();
builder.filter_level(match self.cli.verbose {
0 => LevelFilter::Off,
1 => LevelFilter::Info,
2 => LevelFilter::Debug,
_ => LevelFilter::Trace,
});
builder.format(|buf, record| {
let prefix = match record.metadata().level() {
Level::Error => "nuts-log-error",
Level::Warn => "nuts-log-warn",
Level::Info => "nuts-log-info",
Level::Debug => "nuts-log-debug",
Level::Trace => "nuts-log-trace",
};
writeln!(buf, "{}: {}", prefix, record.args())
});
builder.init();
self
}
pub fn run(self) -> Result<(), BsonError> {
match self.cli.command {
PluginCommand::Info(args) => InfoHandler::new(self.handler).run(&args),
_ => OpenCreateHandler::new(&self.cli.command, self.handler).run(),
}
}
}