initial
This commit is contained in:
commit
3629cb7243
|
|
@ -0,0 +1,2 @@
|
|||
bin
|
||||
!bin/.githold
|
||||
|
|
@ -0,0 +1,7 @@
|
|||
build:
|
||||
amber build src/index.amber bin/some-cli
|
||||
|
||||
clean:
|
||||
rm -rf bin
|
||||
mkdir bin
|
||||
touch bin/.githold
|
||||
|
|
@ -0,0 +1,10 @@
|
|||
import { bold, echo_info, underlined } from "std/env"
|
||||
|
||||
pub fun help(): Null {
|
||||
const usage = underlined(bold("Usage"))
|
||||
const commands = underlined(bold("Commands"))
|
||||
echo_info("{usage}: some-cli <command> [--flag[=value]] [-f[=value]]")
|
||||
echo_info("")
|
||||
echo_info("{commands}")
|
||||
echo_info(" help Print this message or the help of the given command")
|
||||
}
|
||||
|
|
@ -0,0 +1,55 @@
|
|||
import { array_find, array_find_all, array_remove_at } from "std/array"
|
||||
import { slice, split_chars, starts_with, text_contains } from "std/text"
|
||||
|
||||
fun remove_prefix(arg: Text): Text? {
|
||||
|
||||
if starts_with(arg, "--") {
|
||||
return slice(arg, 2)
|
||||
}
|
||||
|
||||
if starts_with(arg, "-") {
|
||||
return slice(arg, 1)
|
||||
}
|
||||
|
||||
fail 2 // "Flags must start with `--` or `-` given {arg}"
|
||||
}
|
||||
|
||||
fun safe_split_flag(arg: Text): [Text] {
|
||||
|
||||
const string_of_chars = split_chars(arg)
|
||||
const first_equals = array_find(string_of_chars, "=")
|
||||
|
||||
if first_equals == -1 {
|
||||
return [arg, ""]
|
||||
}
|
||||
|
||||
const flag = slice(arg, 0, first_equals)
|
||||
const value = slice(arg, first_equals+1)
|
||||
echo "{flag} {value}"
|
||||
return [flag, value]
|
||||
}
|
||||
|
||||
// Returns associative map of flagName -> value or flagName -> "" if just present
|
||||
pub fun arg_parser(arguments: [Text]): [Text]? {
|
||||
|
||||
if len(arguments) < 3 {
|
||||
return [Text]
|
||||
}
|
||||
|
||||
let results = [Text]
|
||||
|
||||
for i in 2..len(arguments) {
|
||||
const arg = remove_prefix(arguments[i]) failed {
|
||||
fail status
|
||||
}
|
||||
|
||||
if text_contains(arg, "=") {
|
||||
results = results + safe_split_flag(arg)
|
||||
continue
|
||||
}
|
||||
|
||||
results = results + [arg, ""]
|
||||
}
|
||||
|
||||
return results
|
||||
}
|
||||
|
|
@ -0,0 +1,8 @@
|
|||
pub fun resolve_status_code(code: Num): Text {
|
||||
if {
|
||||
code == 0: return ""
|
||||
code == 1: return "Unknown error..."
|
||||
code == 2: return "Flags must start with `--` or `-`"
|
||||
else: return "Unknown error... {code}"
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,20 @@
|
|||
import { arg_parser } from "./helpers/arg-parser.amber"
|
||||
import { resolve_status_code } from "./helpers/resolve-status-code.amber"
|
||||
import { help } from "./command-hooks/help.amber"
|
||||
import { echo_error } from "std/env"
|
||||
|
||||
main(cli_params) {
|
||||
|
||||
const command = cli_params[1]
|
||||
const flags = arg_parser(cli_params) failed {
|
||||
echo_error(resolve_status_code(status))
|
||||
fail 1
|
||||
}
|
||||
|
||||
echo "We parsed: command={command} flags={flags}"
|
||||
|
||||
if {
|
||||
command == "help": help()
|
||||
else: help()
|
||||
}
|
||||
}
|
||||
Loading…
Reference in New Issue