mod config;
mod core;
mod dns;
mod doh_json;
mod doh_wire;
mod net;
mod logging;
use crate::net::{server::Server, request::Request};
use crate::config::{cli::CLI, config::Config};
use crate::core::processor::Processor;
use log::*;
use crossbeam_channel::{Sender as XBeamSender, Receiver as XBeamReceiver, self as xbeam_channel};
use srvzio::Service;
use exitcode;
use std::process;
fn main() {
let cli = CLI::new();
logging::init(&cli);
trace!("{:#?}", cli);
if cli.is_list_providers() {
cli.list_providers();
} else if cli.provider().is_none() {
process::exit(exitcode::USAGE);
} else {
info!("Starting...");
let (sender, receiver): (XBeamSender<Request>, XBeamReceiver<Request>) = xbeam_channel::unbounded();
let mut srv_mgr = srvzio::ServiceManager::new();
srv_mgr.register(Box::new(Processor::new(receiver, cli.resolver())));
srv_mgr.register(Box::new(Server::new(&cli, sender)));
srv_mgr.start_and_await();
srv_mgr.await_termination_signal_then_stop();
info!("... Terminated.");
}
}