{"id":20544167,"url":"https://github.com/flintprocessor/bouncer","last_synced_at":"2025-03-06T04:47:20.726Z","repository":{"id":63910097,"uuid":"131876409","full_name":"flintprocessor/Bouncer","owner":"flintprocessor","description":"Command line argument parser written in Swift.","archived":false,"fork":false,"pushed_at":"2018-07-01T06:44:47.000Z","size":136,"stargazers_count":3,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-02-17T07:02:52.910Z","etag":null,"topics":["argument-parser","cli","swift","swift-package-manager"],"latest_commit_sha":null,"homepage":"","language":"Swift","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/flintprocessor.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2018-05-02T16:16:38.000Z","updated_at":"2020-12-06T12:21:53.000Z","dependencies_parsed_at":"2022-11-29T07:12:11.833Z","dependency_job_id":null,"html_url":"https://github.com/flintprocessor/Bouncer","commit_stats":null,"previous_names":[],"tags_count":4,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/flintprocessor%2FBouncer","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/flintprocessor%2FBouncer/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/flintprocessor%2FBouncer/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/flintprocessor%2FBouncer/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/flintprocessor","download_url":"https://codeload.github.com/flintprocessor/Bouncer/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":242150752,"owners_count":20080006,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["argument-parser","cli","swift","swift-package-manager"],"created_at":"2024-11-16T01:42:48.951Z","updated_at":"2025-03-06T04:47:20.704Z","avatar_url":"https://github.com/flintprocessor.png","language":"Swift","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\u003cimg src=\"/Assets/logo.png\" width=\"300\" /\u003e\u003c/div\u003e\n\u003ch1 align=\"center\"\u003e\n  \u003cb\u003eBouncer\u003c/b\u003e\n  \u003cbr\u003e\n  \u003ca href=\"https://travis-ci.org/flintbox/Bouncer\"\u003e\u003cimg src=\"https://travis-ci.org/flintbox/Bouncer.svg?branch=master\" alt=\"Build Status\" /\u003e\u003c/a\u003e\n  \u003ca href=\"https://github.com/flintbox/Bouncer/releases\"\u003e\u003cimg src=\"https://img.shields.io/github/release/flintbox/Bouncer.svg\" alt=\"GitHub release\" /\u003e\u003c/a\u003e\n  \u003ca href=\"https://swift.org/package-manager\"\u003e\u003cimg src=\"https://img.shields.io/badge/Swift%20PM-compatible-orange.svg\" alt=\"Swift Package Manager\" /\u003e\u003c/a\u003e\n  \u003ca href=\"https://github.com/flintbox/Bouncer/blob/master/LICENSE\"\u003e\u003cimg src=\"https://img.shields.io/github/license/mashape/apistatus.svg\" alt=\"license\" /\u003e\u003c/a\u003e\n\u003c/h1\u003e\n\n*Command line argument parser. Bouncer does **all the heavy lifting** for you. Dive into **business logic** in no time.*\n\n**Table of Contents**\n- [Synopsis](#synopsis)\n- [Installation](#installation)\n- [Component](#component)\n  - [Option](#option)\n  - [Operand](#operand)\n  - [Command](#command)\n  - [Program](#program)\n- [Example](#example)\n- [Contribute](#contribute)\n\n## Synopsis\n\nParse\n\n```shell\ngit-mock init . -q --bare --separate-git-dir=../git_dir --shared --template ../template/git-template\n```\n\nand grab values.\n\n```swift\nlet directory         = operands[optional: 0]\nlet quiet             = optionValues.have(quietOption)\nlet bare              = optionValues.have(bareOption)\nlet templateDirectory = optionValues.findOptionalArgument(for: templateOption)\nlet gitDirectory      = optionValues.findOptionalArgument(for: separateGitDirOption)\nlet shared            = optionValues.findOptionalArgument(for: sharedOption)\n```\n\n## Installation\n\nAdd Bouncer to `Package.swift`.\n\n```swift\ndependencies: [\n    .package(url: \"https://github.com/flintbox/Bouncer\", from: \"0.1.2\")\n]\n```\n\nNow import!\n\n```swift\nimport Bouncer\n\nlet program = Program(commands: [])\n```\n\n## Component\n\n### [Option](https://github.com/flintbox/Bouncer/blob/master/Sources/Bouncer/Option/Option.swift)\n\nConfiguration for option like `--path`, `-h`, `--path ./temp` or `-p./temp`. Check regular expressions for matching option in [`OptionNameRegex.swift`](https://github.com/flintbox/Bouncer/blob/master/Sources/Bouncer/Option/OptionNameRegex.swift).\n\nProperty | Type | Description\n-------- | ---- | -----------\n`name` | `String` | Name of option (`[[:alnum:]\\-]+`).\n`shortName` | `Character?` | Short name of option.\n`optional` | `Bool` | If option is optional or not for the command. Used for validation.\n`argumentType` | [`OptionArgumentType`](https://github.com/flintbox/Bouncer/blob/master/Sources/Bouncer/Option/OptionArgumentType.swift) | Option argument type. None, optional, optional with default value or required.\n\n### Operand\n\nBasically, all of arguments following command are operands. Of course, except options and option arguments.\n\n### [Command](https://github.com/flintbox/Bouncer/blob/master/Sources/Bouncer/Command/Command.swift)\n\nConfiguration for command.\n\nProperty | Type | Description\n-------- | ---- | -----------\n`name` | `[String]` | Name of the command. Sub command can be easily expressed like `[\"container\", \"start\"]`.\n`operandType` | [`OperandType`](https://github.com/flintbox/Bouncer/blob/master/Sources/Bouncer/Command/OperandType.swift) | Operand type. Define command accepts how many operands.\n`options` | `[Option]` | Available options.\n`handler` | `CommandHandler` | This block will be called with validated operands and option values. There are extensions for getting specific values from [operand value array](https://github.com/flintbox/Bouncer/blob/master/Sources/Bouncer/OperandValue/OperandValue+Array.swift) and [option value array](https://github.com/flintbox/Bouncer/blob/master/Sources/Bouncer/OptionValue/OptionValue+Array.swift).\n\n### [Program](https://github.com/flintbox/Bouncer/blob/master/Sources/Bouncer/Program/Program.swift)\n\nProgram is initialized with commands. Use program object to parse and run command.\n\n## Example\n\n### [Init.swift](https://github.com/flintbox/Bouncer/blob/master/Sources/git-mock/init/Init.swift)\n\n```swift\nimport Bouncer\n\nlet quietOption =          Option(name: \"quiet\", shortName: \"q\", optional: true, argumentType: .none)\nlet bareOption =           Option(name: \"bare\", optional: true, argumentType: .none)\nlet templateOption =       Option(name: \"template\", optional: true, argumentType: .required)\nlet separateGitDirOption = Option(name: \"separate-git-dir\", optional: true, argumentType: .required)\nlet sharedOption =         Option(name: \"shared\", optional: true, argumentType: .optional(\"group\"))\n\nlet initCommand = Command(\n    name: [\"init\"],\n    operandType: .optionalEqual(1),\n    options: [quietOption, bareOption, templateOption, separateGitDirOption, sharedOption]\n) { program, command, operands, optionValues in\n    let directory = operands[optional: 0]\n    let quiet = optionValues.have(quietOption)\n    let bare = optionValues.have(bareOption)\n    let templateDirectory = optionValues.findOptionalArgument(for: templateOption)\n    let gitDirectory = optionValues.findOptionalArgument(for: separateGitDirOption)\n    let shared = optionValues.findOptionalArgument(for: sharedOption)\n    print(\n        \"\"\"\n\n            init command \u003chttps://git-scm.com/docs/git-init\u003e\n\n            directory    : \\(directory ?? \"nil\")\n            quiet        : \\(quiet)\n            bare         : \\(bare)\n            template dir : \\(templateDirectory ?? \"nil\")\n            git dir      : \\(gitDirectory ?? \"nil\")\n            shared       : \\(shared ?? \"nil\")\n\n        \"\"\"\n    )\n}\n```\n\n### [main.swift](https://github.com/flintbox/Bouncer/blob/master/Sources/git-mock/main.swift)\n\n```swift\nimport Bouncer\n\nlet program = Program(commands: [initCommand])\n\nlet arguments = Array(CommandLine.arguments.dropFirst())\ntry? program.run(withArguments: arguments)\n```\n\n### Case 1\n\n#### Input\n\n```shell\ngit-mock init .\n```\n\n#### Output\n\n```shell\ninit command \u003chttps://git-scm.com/docs/git-init\u003e\n\ndirectory    : .\nquiet        : false\nbare         : false\ntemplate dir : nil\ngit dir      : nil\nshared       : nil\n```\n\n### Case 2\n\n#### Input\n\n```shell\ngit-mock init repository/dir --shared --template=../template --separate-git-dir ../.git --bare\n```\n\n#### Output\n\n```shell\ninit command \u003chttps://git-scm.com/docs/git-init\u003e\n\ndirectory    : repository/dir\nquiet        : false\nbare         : true\ntemplate dir : ../template\ngit dir      : ../.git\nshared       : group\n```\n\n## Contribute\n\nIf you have good idea or suggestion? Please, don't hesitate to open a pull request or send me an [email](mailto:contact@jasonnam.com).\n\nHope you enjoy building command line tool with Bouncer!\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fflintprocessor%2Fbouncer","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fflintprocessor%2Fbouncer","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fflintprocessor%2Fbouncer/lists"}