argopt 包

介绍

argopt 包主要用于帮助解析命令行参数。

主要接口

class ArgOpt

public class ArgOpt {
    public init(shortArgFormat: String)
    public init(longArgList: Array<String>)
    public init(shortArgFormat: String, longArgList: Array<String>)
    public init(args: Array<String>, shortArgFormat: String, longArgList: Array<String>)
}

ArgOpt 类主要用于帮助解析命令行参数(包括参数的特殊含义,如形式为 "-" 和 "--"),该类使用了 String 类和 Char 类的一些函数来辅助实现,提供了一组针对命令行参数字符串或数组的解析函数。

一个命令行参数是由前缀符号、参数名、参数值组成,其中 "-" 表示短参(短命令行参数)的前缀,"--" 表示长参(长命令行参数)的前缀。 可解析的短参参数名只能是字母,可解析长参参数名字符串需满足:以字母开头,字符串中不能包含 "="。

对于以下函数中短参名字符串,和长参名字符串数组入参,需要注意以下几点:

  • 短参名字符串的入参,格式为:"a:",规范为:一位字母和 ":" 的组合,例如:"ab:",该例仅解析 b 作为短参名。
  • 长参名字符串数组入参,字符串格式为:"--testA=" 或 "testA=",规范为:"--" + 长参参数名 + "="(前缀"--"可省略)。
  • 其它情况会可造成不解析或者异常。

init

public init(shortArgFormat: String)

功能:构造 ArgOpt 实例,并从短参名字符串中解析短参名。

参数:

  • shortArgFormat:包含短参名的字符串

异常:

  • IllegalArgumentException:短参名字符串不符合规范

init

public init(longArgList: Array<String>)

功能:构造 ArgOpt 实例,并从列表的字符串中解析长参名。

参数:

  • longArgList:包含长参名的字符串数组

异常:

  • IllegalArgumentException:字符串数组中的长参名字符串不符合规范

init

public init(shortArgFormat: String, longArgList: Array<String>)

功能:构造 ArgOpt 实例,并从短参名字符串中解析短参名、从列表的字符串中解析长参名。

参数:

  • shortArgFormat:包含短参名的字符串
  • longArgList:包含长参名的字符串数组

异常:

  • IllegalArgumentException:短参名字符串不符合规范,或字符串数组中的长参名字符串不符合规范

init

public init(args: Array<String>, shortArgFormat: String, longArgList: Array<String>)

功能:构造 ArgOpt 实例,并从短参名字符串中解析短参名、从列表的字符串中解析长参名,若解析成功,则依据解析出的参数名从参数 args 指定的命令行参数中解析参数名的对应取值。

参数:

  • args:待解析的命令行参数字符串数组
  • shortArgFormat:包含短参名的字符串
  • longArgList:包含长参名的字符串数组

异常:

  • IllegalArgumentException:短参名字符串不符合规范,或字符串数组中的长参名字符串不符合规范

func getArg

public func getArg(arg: String): Option<String>

功能:返回入参 arg 指定参数的解析值。

参数:

  • arg:前缀和参数名组成的字符串(可省略前缀)

返回值:参数解析值

func getUnparseArgs

public func getUnparseArgs(): Array<String>

功能:返回没有被解析的字符串集合。

返回值:存放没有被解析的字符串的数组

func getArgumentsMap

public func getArgumentsMap(): HashMap<String, String>

功能:获取所有已解析的参数名和取值,参数名包含前缀符号。

返回值:存放解析出键值对的哈希表

示例

ArgOpt 构造异常

抛异常示例。

代码如下:

from std import argopt.*

main() {
    /* IllegalArgumentException: Invalid character string: please check */
    let arg: String = "ab:-~"
    try {
        /* the parameter: ab:-~ */
        let ao: ArgOpt = ArgOpt(arg)
        let p: Option<String> = ao.getArg("-b")
        match (p) {
            case Some(v) => println(v)
            case _ => println("NONE")
        }
    } catch (e: Exception) {
        print(e.toString())
    }
    return 0
}

运行结果如下:

IllegalArgumentException: Invalid string, please check the parameter: ab:-~

ArgOpt 构造成功

构造成功示例。

代码如下:

from std import argopt.*

main() {
    var a: Array<String> = Array<String>(["-a123", "-bofo", "-cfoo", "-d789",
             "bar","--condition=foo", "--testing=456",
             "--output-file", "--abc.def","-p","-k123","bbb","a1", "a2"])
    let lof: Array<String> = Array<String>(["condition=", "output-file=", "testing", "testing"])
    let str: String = "ab:c:d:k:u:x"
    let ao: ArgOpt = ArgOpt(a, str, lof)
    a = ao.getUnparseArgs()
    let p: Option<String> = ao.getArg("-b")
    match (p) {
        case Some(v) => println(v)
        case _ => println("NONE")
    }
    0
}

运行结果如下:

ofo

未解析参数

未解析参数示例。

代码如下:

from std import argopt.*

main() {
    var a: Array<String> = Array<String>(["-a123", "-bofo", "-cfoo", "-d789",
             "bar","--condition=foo", "--testing=456",
             "--output-file", "--abc.def", "-p", "-k123", "bbb", "a1", "a2"])
    let lof: Array<String> = Array<String>(["condition=", "output-file=", "testing", "testing"])
    let str: String = "ab:c:d:k:u:x"
    let ao: ArgOpt = ArgOpt(a, str, lof)
    a = ao.getUnparseArgs()
    for (i in 0..a.size) {
        print("${a[i]},")
    }
    0
}

运行结果如下:

-a123,bar,--testing=456,-p,bbb,a1,a2,

成功解析参数

成功解析参数示例。

代码如下:

from std import argopt.*
from std import collection.*

main() {
    let args: Array<String> = Array<String>(["-a123", "-bofo", "-cfoo", "-d789", "bar",
                "--condition=foo", "--testing=456", "--output-file",
                "abc.def", "-p", "-k123", "bbb", "a1", "a2"])
    let longArgList: Array<String> = Array<String>(["condition=", "output-file=", "testing", "testing"])
    let str: String = "a:b:c:d:e"
    let ao: ArgOpt = ArgOpt(args, str, longArgList)
    let map: HashMap<String, String> = ao.getArgumentsMap()
    let value: Option<String> = map.get("--output-file")
    match (value) {
        /* abc.def */
        case Some(v) => println(v)
        case _ => print("NOPASS")
    }
    0
}

运行结果如下:

abc.def