9 个版本
0.4.1 | 2024 年 3 月 18 日 |
---|---|
0.4.0 | 2024 年 3 月 17 日 |
0.3.1 | 2023 年 2 月 15 日 |
0.3.0 | 2022 年 7 月 6 日 |
0.1.3 | 2021 年 8 月 19 日 |
#273 在 Rust 模式
70KB
971 代码行数
bash-builtins
一个 Rust 包,提供实用程序以实现可用于 bash 的可加载内置函数。
有关如何使用此包的详细说明,请参阅 API 文档。
示例
有关更多示例,请参阅 examples
目录。
//! Bash builtin to implement a counter.
use bash_builtins::{builtin_metadata, Args, Builtin, BuiltinOptions, Result};
use std::io::{stdout, Write};
builtin_metadata!(
name = "counter",
create = Counter::default,
short_doc = "counter [-r] [-s value] [-a value]",
long_doc = "
Print a value, and increment it.
Options:
-r\tReset the value to 0.
-s\tSet the counter to a specific value.
-a\tIncrement the counter by a value.
",
);
#[derive(BuiltinOptions)]
enum Opt {
#[opt = 'r']
Reset,
#[opt = 's']
Set(isize),
#[opt = 'a']
Add(isize),
}
#[derive(Default)]
struct Counter(isize);
impl Builtin for Counter {
fn call(&mut self, args: &mut Args) -> Result<()> {
// No options: print the current value and increment it.
if args.is_empty() {
// Use writeln!() instead of println!() to avoid
// panicking if stdout is closed.
writeln!(stdout(), "{}", self.0)?;
self.0 += 1;
return Ok(());
}
// Parse options. They can change the value of the counter, but the
// updated value is stored only if we don't get any error.
let mut value = self.0;
for opt in args.options() {
match opt? {
Opt::Reset => value = 0,
Opt::Set(v) => value = v,
Opt::Add(v) => value += v,
}
}
// It is an error if we receive free arguments.
args.finished()?;
// Update the state and exit.
self.0 = value;
Ok(())
}
}
许可证
此包根据 Apache License 2.0 许可证发布,该许可证与 GPLv3 兼容。
有关兼容性的更多信息,请参阅 https://apache.ac.cn/licenses/GPL-compatibility.html。
依赖项
~1.5MB
~36K SLoC