Bouncer
Build Status GitHub release Swift Package Manager license

命令行参数解析器。Bouncer 为你完成所有繁重的工作。让你立刻专注于业务逻辑

目录

概要

解析

git-mock init . -q --bare --separate-git-dir=../git_dir --shared --template ../template/git-template

并获取值。

let directory         = operands[optional: 0]
let quiet             = optionValues.have(quietOption)
let bare              = optionValues.have(bareOption)
let templateDirectory = optionValues.findOptionalArgument(for: templateOption)
let gitDirectory      = optionValues.findOptionalArgument(for: separateGitDirOption)
let shared            = optionValues.findOptionalArgument(for: sharedOption)

安装

添加 Bouncer 到 Package.swift

dependencies: [
    .package(url: "https://github.com/flintbox/Bouncer", from: "0.1.2")
]

现在导入!

import Bouncer

let program = Program(commands: [])

组件

选项 (Option)

选项的配置,例如 --path, -h, --path ./temp-p./temp。查看正则表达式以匹配 OptionNameRegex.swift 中的选项。

属性 类型 描述
name String 选项的名称 ([[:alnum:]\-]+)。
shortName Character? 选项的短名称。
optional Bool 如果该选项对于命令是否可选。用于验证。
argumentType OptionArgumentType 选项参数类型。None(无参数),optional(可选),optional with default value(可选带默认值)或 required(必需)。

操作数 (Operand)

基本上,所有跟随命令的参数都是操作数。当然,选项和选项参数除外。

命令 (Command)

命令的配置。

属性 类型 描述
name [String] 命令的名称。子命令可以很容易地表示为 ["container", "start"]
operandType OperandType 操作数类型。定义命令接受多少个操作数。
options [Option] 可用的选项。
handler CommandHandler 此代码块将被调用,并带有已验证的操作数和选项值。有一些扩展可以从 操作数值数组选项值数组 中获取特定值。

程序 (Program)

程序使用命令初始化。 使用程序对象来解析和运行命令。

示例

Init.swift

import Bouncer

let quietOption =          Option(name: "quiet", shortName: "q", optional: true, argumentType: .none)
let bareOption =           Option(name: "bare", optional: true, argumentType: .none)
let templateOption =       Option(name: "template", optional: true, argumentType: .required)
let separateGitDirOption = Option(name: "separate-git-dir", optional: true, argumentType: .required)
let sharedOption =         Option(name: "shared", optional: true, argumentType: .optional("group"))

let initCommand = Command(
    name: ["init"],
    operandType: .optionalEqual(1),
    options: [quietOption, bareOption, templateOption, separateGitDirOption, sharedOption]
) { program, command, operands, optionValues in
    let directory = operands[optional: 0]
    let quiet = optionValues.have(quietOption)
    let bare = optionValues.have(bareOption)
    let templateDirectory = optionValues.findOptionalArgument(for: templateOption)
    let gitDirectory = optionValues.findOptionalArgument(for: separateGitDirOption)
    let shared = optionValues.findOptionalArgument(for: sharedOption)
    print(
        """

            init command <https://git-scm.cn/docs/git-init>

            directory    : \(directory ?? "nil")
            quiet        : \(quiet)
            bare         : \(bare)
            template dir : \(templateDirectory ?? "nil")
            git dir      : \(gitDirectory ?? "nil")
            shared       : \(shared ?? "nil")

        """
    )
}

main.swift

import Bouncer

let program = Program(commands: [initCommand])

let arguments = Array(CommandLine.arguments.dropFirst())
try? program.run(withArguments: arguments)

案例 1

输入

git-mock init .

输出

init command <https://git-scm.cn/docs/git-init>

directory    : .
quiet        : false
bare         : false
template dir : nil
git dir      : nil
shared       : nil

案例 2

输入

git-mock init repository/dir --shared --template=../template --separate-git-dir ../.git --bare

输出

init command <https://git-scm.cn/docs/git-init>

directory    : repository/dir
quiet        : false
bare         : true
template dir : ../template
git dir      : ../.git
shared       : group

贡献

如果您有好的想法或建议?请随时打开一个 pull request 或给我发送 电子邮件

希望您喜欢使用 Bouncer 构建命令行工具!