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 命令行界面
9,503 每月下载量
用于 17 个Crates(16个直接使用)
23KB
359 行
clap-stdin
此库为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
特征约束的类型:FromStr
和Clone
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
特征约束的类型:FromStr
和Clone
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读取时不使用特殊字符
当使用MaybeStdin
或FileOrStdin时,您可以通过向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_async
和 FileOrStdin::into_async_reader
的示例。
使用 MaybeStdin
或 FileOrStdin
多次
无论是 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