# cmdline-parser
**Repository Path**: Verlif/cmdline-parser
## Basic Information
- **Project Name**: cmdline-parser
- **Description**: 超简单的行命令解析器
- **Primary Language**: Java
- **License**: Apache-2.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2022-12-09
- **Last Updated**: 2023-01-15
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# CmdlineParser
行命令解析器
超简单的行命令解析器,用于解析与执行行命令,例如:
```shell
--username Verlif --commit "hello world!" --allowed
```
总的来说就是:__解析字符串,执行对应方法__
## 使用
```java
String line = "-abc --username Verlif --commit \"hello world!\" --allowed";
CmdlineParser parser = new CmdlineParser();
// 忽略未知命令,否则会抛出UnknownCmdKeyException异常
parser.ignoreUnknownKey();
// 忽略关键词大小写,可以让"--KEy"也能匹配到"key"
parser.ignoreCase();
// 设置参数解析器
parser.setArgParser(new PrefixWithConfigArgParser("--"));
// 添加指令执行器
parser.addHandler("username", param -> {
System.out.println("所以username是 - " + param);
});
parser.addHandler("allowed", param -> {
System.out.println("所以allowed是 - " + param);
});
parser.addHandler("a", param -> {
System.out.println("这里是a - " + param);
});
parser.addHandler("b", param -> {
System.out.println("这里是b - " + param);
});
parser.addHandler("c", param -> {
System.out.println("这里是c - " + param);
});
// 执行指令
parser.exec(line);
// 上方指令结果与下方相同
ArgValues argValues = new ArgValues();
argValues.add("a", null);
argValues.add("b", null);
argValues.add("c", null);
argValues.add("username", "Verlif");
argValues.add("commit", "hello world!");
argValues.add("allowed", null);
parser.exec(argValues);
// 甚至相当于这样
parser.setArgParser(new HtmlUrlArgParser());
parser.exec("127.0.0.1:81/queue/queue?a&b&c&username=Verlif&commit=hello world&allowed");
```
执行结果如下:
*以下内容输出3次*
```text
这里是a - null
这里是b - null
这里是c - null
所以username是 - Verlif
所以allowed是 - null
```
## 自定义
### 参数解析器
用于解析指令key与对应参数值的类,与需要处理的指令格式有关。例如将`--username Verlif --commit "hello world!" --allowed`解析成以下内容:
| 指令key | 指令值 |
|----------|-------------|
| username | Verlif |
| commit | hello world |
| allowed | `null` |
开发者可以通过自定义参数解析器来解析不同指令格式的字符串,例如解析`HTMLUrl`的参数,例如解析`127.0.0.1:81/queue/queue?a&b&c&username=Verlif&commit=hello world&allowed`。
示例:
```java
/**
* 简单的HTMLUrl参数解析器
*
* @author Verlif
*/
public class HtmlUrlArgParser implements ArgParser {
@Override
public ArgValues parseLine(String line) {
String[] ss = line.split("\\?", 2);
if (ss.length == 1) {
return new ArgValues();
}
return toArgValues(ss[1]);
}
private ArgValues toArgValues(String paramStr) {
ArgValues argValues = new ArgValues();
String[] params = paramStr.split("&");
for (String param : params) {
int i = param.indexOf('=');
if (i == -1) {
argValues.add(param, null);
} else {
argValues.add(param.substring(0, i), param.substring(i + 1));
}
}
return argValues;
}
}
```
### 指令执行器
执行对应指令的方法类,类似`Runnale`,只有一个`handle(String param)`方法。
```java
public interface CmdHandler {
/**
* 执行器执行核心
*
* @param param 参数;可能为null
*/
void handle(String param);
}
```
## 注意
指令调用的顺序与关键词的传入顺序有关。
例如`--a 123 --b 321 --a 789`就会调用以下流程:
> `a`执行器 -> `b`执行器 -> `a`执行器
## 添加依赖
1. 添加Jitpack仓库源
__lastVersion__: [](https://jitpack.io/#Verlif/cmdline-parser)
maven
```xml
jitpack.io
https://jitpack.io
```
Gradle
```text
allprojects {
repositories {
maven { url 'https://jitpack.io' }
}
}
```
2. 加依赖
maven
```xml
com.github.Verlif
cmdline-parser
lastVersion
```
Gradle
```text
dependencies {
implementation 'com.github.Verlif:cmdline-parser:lastVersion'
}
```