Easily add a --port
flag to CLIs using clap.
With the following code in src/main.rs
:
use clap::Parser;
use clap_port_flag::Port;
#[derive(Debug, Parser)]
struct Cli {
#[clap(flatten)]
port: Port,
}
fn main() {
let args = Cli::parse();
let _tcp_listener = args.port.bind().unwrap();
}
When you run the binary, it'll provide the following output:
my-cool-app 0.2.0
Alice Person <alice@person.com>
Application that does things over TCP.
USAGE:
main [OPTIONS]
FLAGS:
-h, --help Prints help information
-V, --version Prints version information
OPTIONS:
--listen-fd <fd> A previously opened network socket. [env: LISTEN_FD=]
-a, --address <hostname> The network address to listen to. [default: 127.0.0.1]
-p, --port <port> The network port to listen to. [env: PORT=]
use clap_port_flag::Port;
use futures::prelude::*;
use hyper::service::service_fn;
use hyper::{Body, Response, Request};
use clap::Parser;
#[derive(Debug, Parser)]
struct Cli {
#[clap(flatten)]
port: Port,
}
async fn hello(_: Request<Body>) -> Result<Response<String>, std::convert::Infallible> {
Ok(Response::new(String::from("Hello World!")))
}
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let args = Cli::parse();
let listener = args.port.bind()?;
let listener = tokio::net::TcpListener::from_std(listener)?;
let addr = listener.local_addr()?;
println!("Server listening on {}", addr);
let (stream, _) = listener.accept().await?;
if let Err(e) = hyper::server::conn::Http::new()
.serve_connection(stream, service_fn(hello))
.await
{
eprintln!("server error: {}", e);
}
Ok(())
}
$ cargo add clap-port-flag
The original version of this crate was sketched out by @TeXitoi in rust-lang-nursery/cli-wg#37.
MIT OR Apache-2.0