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文件系统

Download history 1/week @ 2024-05-21 7/week @ 2024-07-02 129/week @ 2024-07-30

每月 129 次下载

Apache-2.0…

91KB
2K SLoC

nameless

全功能命令行解析

Github Actions CI Status crates.io page docs.rs docs zulip chat

这是一个目前处于实验阶段的项目,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

更多功能

kommandclap_derive 的包装器,并支持相同的属性。

要添加一个标志,例如,#[kommand(short = 'n', long)] number: u32 表示一个类型为 i32 的参数,可以通过命令行上的 -n--number 指定。grep 示例和基本示例展示了这一点。

有关可用功能的完整列表,请参阅 clap-v3 文档

内容概览

该库提供

为什么叫“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