#命令行 #命令处理器 #执行命令 #cmd #解释器 #面向行 #特质

rusty-cmd

用于在 Rust 中创建自定义面向行的命令解释器的crate

4 个版本 (2 个稳定版)

2.0.0 2024 年 6 月 6 日
1.0.0 2024 年 5 月 18 日
0.2.0 2024 年 5 月 7 日
0.1.0 2024 年 5 月 7 日

#3 in #命令处理器

每月下载 25

MIT 许可证

21KB
286

rusty-cmd

用于在 Rust 中创建自定义面向行的命令解释器的crate。

License: MIT Rust Documentation

我将其作为 Rust 学习项目编写,并受到了 Python 的 cmddev.to 文章:A small library for writing line oriented-command interpreters in rust 的启发。

特性

  • 使用 CommandHandler 特质、函数或闭包创建和注册自定义命令解释器。
  • 轻松定义和执行命令。
  • 实现可选命令参数。
  • 将输出重定向到实现 io::Write 的类型。

概述

rusty-cmd 提供了两个模块

  • cmd:用于创建包含 CommandHandler 实现的 Cmd 结构体的 HashMap
  • command_handler:包含 CommandHandler 特质。

示例

use std::io;
use std::io::Write;

use rusty_cmd::cmd::Cmd;
use rusty_cmd::command_handler::{CommandHandler, CommandResult};
use rusty_cmd::handlers::Quit;

/// CommandHandler that prints out help message
#[derive(Default)]
pub struct Help;

impl<W> CommandHandler<W> for Help
where
    W: std::io::Write,
{
    fn execute(&self, output: &mut W, _args: &[&str]) -> CommandResult {
        writeln!(output, "Help message").expect("Should be able to write to output");
        CommandResult::Continue
    }
}

/// CommandHandler that emulates the basic bash touch command to create a new file
#[derive(Default)]
pub struct Touch;

impl<W> CommandHandler<W> for Touch
where
    W: std::io::Write,
{
    fn execute(&self, output: &mut W, _args: &[&str]) -> CommandResult {
        let option_filename = _args.first();

        match option_filename {
            Some(filename) => {
                let fs_result = std::fs::File::create(filename);
                match fs_result {
                    Ok(file) => writeln!(output, "Created file: {:?}", file)
                        .expect("Should be able to write to output"),
                    Err(_) => writeln!(output, "Could not create file: {}", filename)
                        .expect("Should be able to write to output"),
                }
            }
            None => println!("Need to specify a filename"),
        }
        CommandResult::Continue
    }
}

fn main() -> Result<(), std::io::Error> {
    let mut cmd = Cmd::new(io::BufReader::new(io::stdin()), io::stdout());

    let help = Help;
    let hello = Touch;
    let quit = Quit::default();

    cmd.add_cmd(String::from("help"), help)?;
    cmd.add_cmd(String::from("touch"), hello)?;
    cmd.add_cmd_fn(String::from("greet"), |output, _args| {
        writeln!(output, "hello!").expect("Should be able to write to output");
        CommandResult::Continue
    })?;
    cmd.add_cmd(String::from("quit"), quit)?;

    cmd.run()?;

    Ok(())
}

使用方法

要在项目中使用 rusty-cmd,请将以下内容添加到您的 Cargo.toml 文件中

[dependencies]
rusty-cmd = "2.0.0"

然后在 Rust 代码中导入 crate

use rusty_cmd::command_handler::{CommandHandler, CommandResult};
use rusty_cmd::cmd::Cmd;

贡献

我们欢迎贡献!请参阅我们的 贡献指南

贡献者 ✨

Miguel Alizo
Miguel Alizo

🦀✅
John Aughey
John Aughey

🦀✅

许可证

本项目采用 MIT 许可证 - 请参阅 LICENSE 文件了解详细信息。

无运行时依赖