clap_flags 0.3.0

Collection of reusable flags for Clap
Documentation
extern crate clap_flags;
#[macro_use]
extern crate structopt;
#[macro_use]
extern crate log;
extern crate futures;
extern crate hyper;
extern crate tokio;

use futures::prelude::*;
use hyper::service::service_fn_ok;
use hyper::{Body, Response, Server};
use structopt::StructOpt;

#[derive(Debug, StructOpt)]
struct Cli {
  #[structopt(flatten)]
  verbosity: clap_flags::Verbosity,
  #[structopt(flatten)]
  logger: clap_flags::Log,
  #[structopt(flatten)]
  port: clap_flags::Port,
}

fn main() -> Result<(), Box<dyn std::error::Error>> {
  let args = Cli::from_args();
  let listener = args.port.bind()?;

  args.logger.log_all(args.verbosity.log_level())?;
  info!("Server listening on {}", listener.local_addr()?);

  let handle = tokio::reactor::Handle::current();
  let listener = tokio::net::TcpListener::from_std(listener, &handle)?;

  let server = Server::builder(listener.incoming())
    .serve(|| service_fn_ok(|_| Response::new(Body::from("Hello World"))))
    .map_err(|e| error!("server error: {}", e));
  tokio::run(server);

  Ok(())
}