aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorsigoden <sigoden@gmail.com>2024-06-06 13:28:59 +0800
committerGitHub <noreply@github.com>2024-06-06 13:28:59 +0800
commitc6eeb84402f50d05002ebbaf2d1652f42ff060aa (patch)
tree7f6c5fe65e573c6abe0252d7196bfcd2e0035bc8
parenta144077aec90d13587d67b3a2065d5728d4f6319 (diff)
downloadllm-functions-docker-c6eeb84402f50d05002ebbaf2d1652f42ff060aa.tar.gz
feat: add scripts/create.sh for creating tool script quickly (#23)
-rw-r--r--Argcfile.sh10
-rwxr-xr-xscripts/create.sh117
2 files changed, 127 insertions, 0 deletions
diff --git a/Argcfile.sh b/Argcfile.sh
index 8c3c50c..ae17100 100644
--- a/Argcfile.sh
+++ b/Argcfile.sh
@@ -174,6 +174,16 @@ install() {
fi
}
+# @cmd Create a boilplate tool script file.
+# It automatically generate declaration json for `*.py` and `*.js` and generate `@option` tags for `.sh`.
+# Examples:
+# argc create abc.sh foo bar! baz+ qux*
+# @arg name! The script filename.
+# @arg params* The script parameters
+create() {
+ ./scripts/create.sh "$@"
+}
+
# @cmd Show pre-requisite tool versions
version() {
uname -a
diff --git a/scripts/create.sh b/scripts/create.sh
new file mode 100755
index 0000000..27e2441
--- /dev/null
+++ b/scripts/create.sh
@@ -0,0 +1,117 @@
+#!/usr/bin/env bash
+set -e
+
+# @describe Create a boilplate tool script file.
+# @arg name! The script filename.
+# @arg params* The script parameters
+
+main() {
+ ext="${argc_name##*.}"
+ output="tools/$argc_name"
+ if [[ -f "$output" ]]; then
+ _die "$output already exists"
+ fi
+ case $ext in
+ sh) create_sh ;;
+ js) create_js ;;
+ py) create_py ;;
+ *) _die "Invalid extension name: '$ext'" ;;
+ esac
+}
+
+create_sh() {
+ cat <<-'EOF' | sed 's/__DESCRIBE_TAG__/# @describe/g' > "$output"
+#!/usr/bin/env bash
+set -e
+
+__DESCRIBE_TAG__
+EOF
+ for param in "${argc_params[@]}"; do
+ echo "# @option --$(echo $param | sed 's/-/_/g')" >> "$output"
+ done
+ cat <<-'EOF' >> "$output"
+
+main() {
+ ( set -o posix ; set ) | grep ^argc_ # inspect all argc variables
+}
+
+eval "$(argc --argc-eval "$0" "$@")"
+EOF
+ chmod +x "$output"
+}
+
+create_js() {
+ cat <<EOF > "$output"
+exports.declarate = function declarate() {
+ return $(build_schema)
+}
+
+exports.execute = function execute(data) {
+ console.log(data)
+}
+EOF
+}
+
+create_py() {
+ cat <<EOF > "$output"
+def declarate():
+ return $(build_schema)
+
+
+def execute(data):
+ print(data)
+EOF
+}
+
+build_schema() {
+ echo '{
+ "name": "'"${argc_name%%.*}"'",
+ "description": "",
+ "parameters": '"$(build_properties)"'
+ }' | jq '.' | sed '2,$s/^/ /g'
+}
+
+build_properties() {
+ required_params=()
+ properties=''
+ for param in "${argc_params[@]}"; do
+ if [[ "$param" == *'!' ]]; then
+ param="${param::-1}"
+ required_params+=("$param")
+ property='{"'"$param"'":{"type":"string","description":""}}'
+ elif [[ "$param" == *'+' ]]; then
+ param="${param::-1}"
+ required_params+=("$param")
+ property='{"'"$param"'":{"type":"array","description":"","items": {"type":"string"}}}'
+ elif [[ "$param" == *'*' ]]; then
+ param="${param::-1}"
+ property='{"'"$param"'":{"type":"array","description":"","items": {"type":"string"}}}'
+ else
+ property='{"'"$param"'":{"type":"string","description":""}}'
+ fi
+ properties+="$property"
+ done
+ required=''
+ for param in "${required_params[@]}"; do
+ if [[ -z "$required" ]]; then
+ required=',"required":['
+ fi
+ required+="\"$param\","
+ done
+ if [[ -n "$required" ]]; then
+ required="${required::-1}"
+ required+="]"
+ fi
+ echo '{
+ "type": "object",
+ "properties": '"$(echo "$properties" | jq -s 'add')$required"'
+ }' | jq '.'
+}
+
+_die() {
+ echo "$*"
+ exit 1
+}
+
+# See more details at https://github.com/sigoden/argc
+eval "$(argc --argc-eval "$0" "$@")" \ No newline at end of file