24 个版本 (15 个破坏性版本)
0.15.2 | 2024 年 3 月 29 日 |
---|---|
0.15.0 | 2023 年 6 月 30 日 |
0.13.0 | 2023 年 3 月 29 日 |
0.12.0 | 2022 年 11 月 8 日 |
0.2.5 | 2021 年 3 月 15 日 |
#260 在 文件系统
每月 129 次下载
91KB
2K SLoC
这是一个目前处于实验阶段的项目,API 和命令行参数语法目前尚不稳定。
Nameless 提供全功能命令行解析。这意味着您只需编写一个使用所需类型的参数的 main
函数,添加一个 常规 文档注释,其余的将由它来处理
Rust 代码
use nameless::{InputByteStream, OutputByteStream};
use std::io::{self, Read, Write};
/// A simple program with input and output
///
/// # Arguments
///
/// * `input` - Input source
/// * `output` - Output sink
#[kommand::main]
fn main(mut input: InputByteStream, mut output: OutputByteStream) -> io::Result<()> {
let mut s = String::new();
input.read_to_string(&mut s)?;
output.write_all(s.as_bytes())
}
Cargo.toml
[dependencies]
kommand = "0"
nameless = "0"
Nameless 完全处理 "字符串到流" 的转换。在这个过程中,它不仅支持文件,还支持 gzipped 文件(*.gz
)、stdin/stdout(-
)、子进程($(...)
)(目前不在 Windows 上支持),以及 URL,包括 http:
、https:
、scp:
(启用 "ssh2" 特性)、file:
和 data:
。在输出时,nameless 自动通过 bat
处理数据管道以进行语法高亮和分页。因此,当您的代码忙于执行一项任务时,nameless 会负责数据的流入和流出。
"一切皆 URL,更多",在 Linux、macOS、Windows 等操作系统上。
kommand::main
解析文档注释以提取程序描述和参数。上面的示例的命令行用法如下
$ cargo run -- --help
simple-filter 0.0.0
A simple program with input and output
USAGE:
simple-filter <input> <output>
FLAGS:
-h, --help Prints help information
-V, --version Prints version information
ARGS:
<input> Input source
<output> Output sink
更多功能
kommand
是 clap_derive
的包装器,并支持相同的属性。
要添加一个标志,例如,#[kommand(short = 'n', long)] number: u32
表示一个类型为 i32
的参数,可以通过命令行上的 -n
或 --number
指定。grep 示例和基本示例展示了这一点。
有关可用功能的完整列表,请参阅 clap-v3 文档。
内容概览
该库提供
-
新的流类型,用于处理字节流:
InputByteStream
、OutputByteStream
和InteractiveByteStream
,以及用于处理文本流的InputTextStream
、OutputTextStream
和InteractiveTextStream
。这些类型实现了Read
和Write
,因此可以与现有的 Rust 代码兼容。您可以使用这些类型在类型感知命令行解析包中,如
nameless-clap_derive
或本库自带的kommand
。(nameless-clap_derive
是clap_derive
的临时分支;我们正在将我们的补丁上游化)。 -
一个新的命令行解析包,
kommand
,它类似于paw
,但使用函数参数语法而不是选项结构。命令行参数可以使用任何实现了标准FromStr
特性的类型,包括内置类型如i32
或bool
,以及库类型如Regex
或Duration
。请参阅 示例目录 以获取更多示例。
为什么叫“nameless”呢?
“nameless”这个名字指的是从程序的角度来看,输入和输出的字符串名称被库隐藏了。
当然,有时您确实需要知道输入的名称,例如在错误消息中显示它。Nameless 的 pseudonym
机制为 InputByteStream
和其他流类型提供了名称,允许在不暴露给应用程序的情况下显示名称。
有时您想了解输入文件的扩展名,以确定它是哪种类型的输入。 InputByteStream
和其他流类型都有一个 media_type
函数,该函数返回 媒体类型(也称为 MIME 类型)。如果输入是文件,类型将根据扩展名推断;如果是 HTTP 流,类型将根据 Content-Type
头部推断,等等。
隐藏名称为什么很重要?从理论层面讲,大多数计算不应该关心数据来自哪里或去向何方。这有助于将程序的主要功能与程序如何与资源本地组织交互分离开来。从实用层面讲,这是 nameless 能够透明地支持 URL、子进程和其他功能的原因。它还将支持在传统平台上有用的应用程序,同时也能在缺乏文件系统的平台(如嵌入式系统或具有新型存储抽象的系统)上运行。
隐藏名称也有助于程序避免意外具有依赖于它访问的文件名称的行为,这在确定构建环境中是一个常见的问题来源。
数据 URL
data:
URL 并不是广为人知,但很酷,值得特别提及。它们在 URL 自身携带一个负载字符串,该字符串被用作输入流。例如,打开 data:,Hello%2C%20World%21
将产生一个读取字符串 "Hello, World!" 的输入流。负载也可以是 base64 编码的,如下所示: data:text/plain;base64,SGVsbG8sIFdvcmxkIQ==
。因此,您可以直接将字面字符串传递到程序输入流,而不是创建临时文件。
展望未来
Nameless 正在不断发展!请关注这个空间,了解更多信息,如果您对我们的未来方向感兴趣,可以在 Zulip 上与我们聊天。
文学引用
“这一定是那片森林,”她若有所思地对着自己说,“那里的东西没有名字。”
—— 刘易斯·卡罗尔的《通过镜子看》
依赖关系
~23–34MB
~726K SLoC