#指令 #命令 #执行 #字符串 #引擎 #输入 #字符串格式

command-engine

将字符串指令转换为代码执行

2 个版本 (1 个稳定版)

1.0.0 2024年4月29日
1.0.0-rc.12024年4月27日

解析器实现 中排名第 1290

Download history 338/week @ 2024-04-26 26/week @ 2024-05-03 3/week @ 2024-05-17 2/week @ 2024-05-24 3/week @ 2024-05-31 1/week @ 2024-06-07

每月下载量 65

GPL-3.0-only

23KB
459

命令引擎

将字符串指令转换为代码执行。

引擎

此包提供了一个默认引擎,如果启用默认功能,则存在。它是一个容器,可以执行您的命令。

默认引擎有 2 个版本

  • sync - 默认。
  • async - 启用 async 功能。

指令

给定输入被反序列化为在 Instruction 结构体中定义的特定格式。

它允许一个 caller 命令、多个位置 args,以及额外的 o_args,这些像标志一样可以包含 sub_args

格式

<caller> <arg> <arg> --<o_arg> <sub_arg> <sub_arg> --<o_arg>

示例

example argument1 argument2 --flag2 child1 child2 --flag3 --flag1

反序列化为

Instruction {
    caller: "example",
    args: vec!["argument1", "argument2"],
    o_args: {
        let mut map = HashMap::new();
        map.insert("--flag2", Some(vec!["child1", "child2"]));
        map.insert("--flag3", None);
        map.insert("--flag1", None);
        map
    },
    input: "example argument1 argument2 --flag2 child1 child2 --flag3 --flag1",
};

要添加参数中的空格,请使用双引号 "

example "argument 1" "--flag 2" "child 1"

如果参数中有双引号,建议使用收集器 #

example #"argument "quotes" 1"#

没有转义字符以避免任何堆分配。每个参数都是从输入中取出的字符串切片。

示例

同步版本

use command_engine::*;

pub struct Example;

impl CommandInfo for Example {
    fn caller(&self) -> &'static str {
        "ex"
    }
}

impl Command for Example {
    type Output = String;

    fn on_execute(&self, ins: Instruction) -> Self::Output {
        format!("{:?}", ins)
    }
}

fn main() {
    let input = "ex arg --o_arg sub_arg";
    
    let mut engine = Engine::new();
    engine.insert(Example);
    
    // Will return formatted string of the Instruction.
    let output = engine.execute(input).unwrap();
    println!("{}", output);
}

免责声明

待办事项 (未来)

  • 自定义指令(就像输出一样)
  • 集成帮助命令

版本

  • *.*.* - 已发布。
  • *.*.*-rc.* - 发布候选。
  • *.*.*-dev - 未在生产中发布。
  • 0.*.* - 已弃用。

依赖

~0–1.1MB
~19K SLoC