#port #clap-parser #flags #cli #networking #cli-applications #structopt

clap-port-flag

使用Structopt轻松为CLIs添加--port标志

5个版本 (3个重大更改)

0.4.0 2022年9月29日
0.3.0 2018年7月13日
0.2.0 2018年7月10日
0.1.1 2018年6月3日
0.1.0 2018年6月3日

#673 in 网络编程

每月24次下载
用于4个crates2 直接使用)

MIT/Apache

22KB
90

clap-port-flag

crates.io version build status downloads docs.rs docs

使用clap轻松为CLIs添加--port标志。

用法

示例:基础

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

运行二进制文件时,它将提供以下输出

my-cool-app 0.2.0
Alice Person <[email protected]>
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=]

示例:Hyper

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

进一步阅读

致谢

此crate的原始版本由@TeXitoirust-lang-nursery/cli-wg#37中草拟。

许可证

MIT OR Apache-2.0

依赖关系

~1.2–1.7MB
~33K SLoC