#stdin #clap #value #arguments #read #wrapper #reading

bin+lib clap-stdin

提供了一种类型,用于轻松从stdin接受Clap参数

9个不稳定版本 (4个破坏性)

0.5.1 2024年7月12日
0.5.0 2024年7月6日
0.4.0 2024年1月8日
0.3.0 2023年12月10日
0.1.1 2023年4月26日

#89 in 命令行界面

Download history 1244/week @ 2024-05-03 1243/week @ 2024-05-10 2545/week @ 2024-05-17 2283/week @ 2024-05-24 1803/week @ 2024-05-31 1720/week @ 2024-06-07 2255/week @ 2024-06-14 2981/week @ 2024-06-21 2391/week @ 2024-06-28 3352/week @ 2024-07-05 2397/week @ 2024-07-12 3055/week @ 2024-07-19 2082/week @ 2024-07-26 2149/week @ 2024-08-02 2193/week @ 2024-08-09 2136/week @ 2024-08-16

9,503 每月下载量
用于 17 个Crates(16个直接使用)

MIT/Apache

23KB
359

clap-stdin Build

此库为clap Arg提供了两种包装类型,有助于处理可能通过stdin传入值的情况。当需要从stdin读取Arg值时,用户将通过常用的stdin别名:-

  • MaybeStdin:当值可以通过args或stdin传入时使用
  • FileOrStdin:当值可以从文件或stdin读取时使用

MaybeStdin

使用clap的derive功能对位置参数进行示例使用

use clap::Parser;

use clap_stdin::MaybeStdin;

#[derive(Debug, Parser)]
struct Args {
    value: MaybeStdin<String>,
}

let args = Args::parse();
println!("value={}", args.value);

调用此CLI

# using stdin for positional arg value
$ echo "testing" | cargo run -- -
value=testing

兼容类型

MaybeStdin可以包装任何符合Arg特征约束的类型:FromStrClone

use std::path::PathBuf;
use clap::Parser;
use clap_stdin::MaybeStdin;

#[derive(Debug, Parser)]
struct Args {
    path: MaybeStdin<PathBuf>,
}
$ pwd | ./example -

FileOrStdin

使用clap的derive功能对位置参数进行示例使用

use clap::Parser;

use clap_stdin::FileOrStdin;

#[derive(Debug, Parser)]
struct Args {
    input: FileOrStdin,
}

# fn main() -> anyhow::Result<()> {
let args = Args::parse();
println!("input={}", args.input.contents()?);
# Ok(())
# }

调用此CLI

# using stdin for positional arg value
$ echo "testing" | cargo run -- -
input=testing

# using filename for positional arg value
$ echo "testing" > input.txt
$ cargo run -- input.txt
input=testing

兼容类型

FileOrStdin可以包装任何符合Arg特征约束的类型:FromStrClone

use clap::Parser;
use clap_stdin::FileOrStdin;

#[derive(Debug, Parser)]
struct Args {
    path: FileOrStdin<u32>,
}
# Value from stdin
$ wc ~/myfile.txt -l | ./example -

# Value from file
$ cat myfile.txt
42
$ .example myfile.txt

从stdin读取时不使用特殊字符

当使用MaybeStdinFileOrStdin时,您可以通过向clap提供一个default_value,允许您的用户省略“-”字符以从stdin读取。这对于位置参数和可选参数都适用

use clap::Parser;

use clap_stdin::FileOrStdin;

#[derive(Debug, Parser)]
struct Args {
    #[clap(default_value = "-")]
    input: FileOrStdin,
}

# fn main() -> anyhow::Result<()> {
let args = Args::parse();
println!("input={}", args.input.contents()?);
# Ok(())
# }

调用此CLI

# using stdin for positional arg value
$ echo "testing" | cargo run
input=testing

# using filename for positional arg value
$ echo "testing" > input.txt
$ cargo run -- input.txt
input=testing

异步支持

FileOrStdin 还可以与 tokio::io::AsyncRead 结合使用,通过 tokio 功能。请参阅 FileOrStdin::contents_asyncFileOrStdin::into_async_reader 的示例。

使用 MaybeStdinFileOrStdin 多次

无论是 MaybeStdin 还是 FileOrStdin,它们都会在运行时检查是否多次读取 stdin。如果你有互斥的参数,这些参数都应该能够读取 stdin,但请注意,如果两个以上的 MaybeStdin 参数都接收到 "-" 值,用户将收到错误。

例如,这可以编译

use clap_stdin::{FileOrStdin, MaybeStdin};

#[derive(Debug, clap::Parser)]
struct Args {
    first: FileOrStdin,
    second: MaybeStdin<u32>,
}

如果 stdin 别名 - 只传递给其中一个参数,它将正常工作

$ echo "2" | ./example FIRST -

但如果尝试同时使用 stdin 读取两个参数,则第二个参数将没有值

$ echo "2" | ./example - -
error: invalid value '-' for '<SECOND>': stdin argument used more than once

许可证

clap-stdin 同时受 MIT 和 Apache 许可证,版本 2.0 许可,如许可证文件 LICENSE-MIT 和 LICENSE-APACHE 中所述。

依赖关系

~0.3–2MB
~39K SLoC