diff options
| author | sigoden <sigoden@gmail.com> | 2024-05-15 08:50:49 +0000 |
|---|---|---|
| committer | sigoden <sigoden@gmail.com> | 2024-05-16 00:39:29 +0000 |
| commit | 281bf5623dbf88b176801f3a780820801e15e70d (patch) | |
| tree | 2129e5078afe2cce2a17e43715731607131e3602 /Argcfile.sh | |
| download | llm-functions-docker-281bf5623dbf88b176801f3a780820801e15e70d.tar.gz | |
init commit
Diffstat (limited to 'Argcfile.sh')
| -rw-r--r-- | Argcfile.sh | 95 |
1 files changed, 95 insertions, 0 deletions
diff --git a/Argcfile.sh b/Argcfile.sh new file mode 100644 index 0000000..e3c4d9c --- /dev/null +++ b/Argcfile.sh @@ -0,0 +1,95 @@ +#!/usr/bin/env bash +set -e + +# @meta dotenv + + +# @cmd Call the function +# @arg func![`_choice_func`] The function name +# @arg args~[?`_choice_func_args`] The function args +call() { + "./bin/$argc_func" "${argc_args[@]}" +} + +# @cmd Build declarations for specific functions +# @option --output=functions.json <FILE> Specify a file path to save the function declarations +# @option --names-file=functions.txt Specify a file containing function names +# @arg funcs*[`_choice_func`] The function names +build-declarations() { + if [[ "${#argc_funcs[@]}" -gt 0 ]]; then + names=("${argc_funcs[@]}" ) + elif [[ -f "$argc_names_file" ]]; then + names=($(cat "$argc_names_file")) + fi + if [[ -z "$names" ]]; then + _die "error: no specific function" + fi + result=() + for name in "${names[@]}"; do + result+=("$(build-func-declaration "$name")") + done + echo "["$(IFS=,; echo "${result[*]}")"]" | jq '.' > "$argc_output" +} + +# @cmd +# @arg func![`_choice_func`] The function name +build-func-declaration() { + argc --argc-export bin/$1 | \ + jq -r ' + def parse_description(flag_option): + if flag_option.describe == "" then + {} + else + { "description": flag_option.describe } + end; + + def parse_enum(flag_option): + if flag_option.choice.type == "Values" then + { "enum": flag_option.choice.data } + else + {} + end; + + def parse_property(flag_option): + [ + { condition: (flag_option.flag == true), result: { type: "boolean" } }, + { condition: (flag_option.multiple_occurs == true), result: { type: "array", items: { type: "string" } } }, + { condition: (flag_option.notations[0] == "INT"), result: { type: "integer" } }, + { condition: (flag_option.notations[0] == "NUM"), result: { type: "number" } }, + { condition: true, result: { type: "string" } } ] + | map(select(.condition) | .result) | first + | (. + parse_description(flag_option)) + | (. + parse_enum(flag_option)) + ; + + + def parse_parameter(flag_options): + { + type: "object", + properties: (reduce flag_options[] as $item ({}; . + { ($item.id | sub("-"; "_"; "g")): parse_property($item) })), + required: [flag_options[] | select(.required == true) | .id], + }; + + { + name: (.name | sub("-"; "_"; "g")), + description: .describe, + parameters: parse_parameter([.flag_options[] | select(.id != "help" and .id != "version")]) + }' +} + +_choice_func() { + ls -1 bin +} + +_choice_func_args() { + args=( "${argc__positionals[@]}" ) + argc --argc-compgen generic "bin/${args[0]}" "${args[@]}" +} + +_die() { + echo "$*" + exit 1 +} + +# See more details at https://github.com/sigoden/argc +eval "$(argc --argc-eval "$0" "$@")" |
