#帮助 #命令 #输入 #CLI #

cliargs_t

简单的Rust命令解析器

1个不稳定版本

0.1.0 2021年1月18日

#958命令行界面

每月 22 次下载
用于 eavesdropper_cli

MIT 许可证

13KB
206 代码行

cliargs_t

一个简单的库,可以快速创建CLI应用程序,无需处理用户输入解析。

优点 缺点
易于使用 缺少更复杂库拥有的功能
提供自动帮助命令

用户体验

如果用户使用下面的示例代码,他们可能会这样使用您的命令

无标志:hello

标志:hello -a flag_value

帮助命令

这个库提供已经实现的帮助命令!

help:将提供命令列表、它们的帮助描述以及它们的标志数量。

help -c command_name:将显示命令的帮助描述以及详细的标志帮助。

help -c command_name -f flag_name:将显示指定命令的特定标志的帮助信息。

创建命令

下面的示例展示了如何通过实现Command trait创建一个命令实例。

struct HelloCommand {}

impl cliargs_t::Command for HelloCommand {
    
    fn execute_command(&self, flags: std::collections::HashMap<std::string::String, std::string::String>) {
        println!("Hello from the command!");
    }

    fn get_information(&self) -> cliargs_t::CommandInformation { 
        return cliargs_t::CommandInformation {
            command_name: "hello",
            command_help: "says hello",
            flags: vec![
                cliargs_t::Flag {
                    identifier: "a",
                    flag_help: "some example flag -a",
                    required: false
                }
            ]
        }
    }
}

主循环

这是一个主方法示例,可能将输入通过此库进行路由。在这个例子中,我使用了rustyline库来简化我的用户输入读取,但只要将适当的格式传递给handle_input()方法,任何用户输入方法都可以工作。

use std::io::Read;
use rustyline::error::ReadlineError;
use rustyline::Editor;

fn main() {
    let hello_command: Box<cliargs_t::Command> = Box::new(HelloCommand {});
    let mut commands = vec![
        hello_command
    ];
    let commander = cliargs_t::Commander::new(&mut commands);

    let mut rl = Editor::<()>::new();
    if rl.load_history("history.txt").is_err() {
        println!("No previous history.");
    }

    loop {
        let readline = rl.readline(">> ");
        match readline {
            Ok(line) => {
                rl.add_history_entry(line.as_str());
                commander.handle_input(line);
            },
            Err(ReadlineError::Interrupted) => {
                println!("CTRL-C");
                break;
            },
            Err(ReadlineError::Eof) => {
                println!("CTRL-D");
                break
            },
            Err(err) => {
                println!("Error: {:?}", err);
                break
            }
        }
    }
    rl.save_history("history.txt").unwrap();
}

依赖项

~1.5MB
~36K SLoC