clap-port-flag

crates.io version build status downloads docs.rs docs

Easily add a --port flag to CLIs using clap.

Usage

Example: Base

With the following code in src/main.rs:

```rust,norun use clap::Parser; use clapport_flag::Port;

[derive(Debug, Parser)]

struct Cli { #[clap(flatten)] port: Port, }

fn main() { let args = Cli::parse(); let tcplistener = args.port.bind().unwrap(); } ```

When you run the binary, it'll provide the following output:

```txt 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 A previously opened network socket. [env: LISTEN_FD=] -a, --address The network address to listen to. [default: 127.0.0.1] -p, --port The network port to listen to. [env: PORT=] ```

Example: Hyper

```rust,norun use clapportflag::Port; use futures::prelude::*; use hyper::service::servicefn; use hyper::{Body, Response, Request}; use clap::Parser;

[derive(Debug, Parser)]

struct Cli { #[clap(flatten)] port: Port, }

async fn hello(_: Request) -> Result, std::convert::Infallible> { Ok(Response::new(String::from("Hello World!"))) }

[tokio::main]

async fn main() -> Result<(), Box> { let args = Cli::parse(); let listener = args.port.bind()?; let listener = tokio::net::TcpListener::fromstd(listener)?; let addr = listener.localaddr()?;

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(())

} ```

Installation

sh $ cargo add clap-port-flag

Further Reading

Acknowledgements

The original version of this crate was sketched out by @TeXitoi in rust-lang-nursery/cli-wg#37.

License

MIT OR Apache-2.0