#[macro_use]
extern crate tracing;
extern crate tracing_subscriber;
use tracing_subscriber::{FmtSubscriber};
use tracing_subscriber::filter::{LevelFilter};
extern crate structopt;
use structopt::StructOpt;
extern crate streamdeck;
use streamdeck::{StreamDeck, Filter};
extern crate autodeck;
use autodeck::{Automation, Options};
#[derive(StructOpt)]
#[structopt(name = "autodeck", about = "An Elgato StreamDeck based automation daemon")]
struct CliOptions {
#[structopt(short, long, default_value="/etc/autodeck/autodeck.toml", env="CONFIG_FILE")]
config_file: String,
#[structopt(flatten)]
filter: Filter,
#[structopt(flatten)]
automate: Options,
#[structopt(long = "log-level", default_value = "info", env="LOG_LEVEL")]
level: LevelFilter,
}
fn main() {
let opts = CliOptions::from_args();
let _ = FmtSubscriber::builder().with_max_level(opts.level.clone()).try_init();
let mut a = match Automation::load(&opts.config_file) {
Ok(v) => v,
Err(e) => {
error!("Error loading automation: {:?}", e);
std::process::exit(-1);
}
};
let mut deck = match StreamDeck::connect(opts.filter.vid, opts.filter.pid, opts.filter.serial) {
Ok(d) => d,
Err(e) => {
error!("Error connecting to streamdeck: {:?}", e);
std::process::exit(-2);
}
};
if let Err(e) = a.run(&mut deck, opts.automate) {
error!("Automata error: {:?}", e);
std::process::exit(-23);
}
}