aboutsummaryrefslogtreecommitdiffstats
path: root/scripts/create-tool.sh
diff options
context:
space:
mode:
authorsigoden <sigoden@gmail.com>2024-06-07 04:06:59 +0800
committerGitHub <noreply@github.com>2024-06-07 04:06:59 +0800
commit2b07fc2c7e4e6311d35ae72c17b25e47680d61f6 (patch)
tree813ea77176ccd89d91aa7b4e70771755eaf2cf41 /scripts/create-tool.sh
parent6d1ad27900634bd16089eb3fe847fe9583dcf3d9 (diff)
downloadllm-functions-docker-2b07fc2c7e4e6311d35ae72c17b25e47680d61f6.tar.gz
refactor: rename scripts (#29)
Diffstat (limited to 'scripts/create-tool.sh')
-rwxr-xr-xscripts/create-tool.sh125
1 files changed, 125 insertions, 0 deletions
diff --git a/scripts/create-tool.sh b/scripts/create-tool.sh
new file mode 100755
index 0000000..40d2ef3
--- /dev/null
+++ b/scripts/create-tool.sh
@@ -0,0 +1,125 @@
+#!/usr/bin/env bash
+set -e
+
+# @describe 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*
+# ./scripts/create-tool.sh test.py foo bar! baz+ qux*
+# @arg name! The script file name.
+# @arg params* The script parameters
+
+main() {
+ output="tools/$argc_name"
+ if [[ -f "$output" ]]; then
+ _die "$output already exists"
+ fi
+ ext="${argc_name##*.}"
+ support_exts=('.sh' '.js' '.py')
+ if [[ "$ext" == "$argc_name" ]]; then
+ _die "No extension name, pelease add one of ${support_exts[*]}"
+ fi
+ case $ext in
+ sh) create_sh ;;
+ js) create_js ;;
+ py) create_py ;;
+ *) _die "Invalid extension name: $ext, must be one of ${support_exts[*]}" ;;
+ 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:0:$((${#param}-1))}"
+ required_params+=("$param")
+ property='{"'"$param"'":{"type":"string","description":""}}'
+ elif [[ "$param" == *'+' ]]; then
+ param="${param:0:$((${#param}-1))}"
+ required_params+=("$param")
+ property='{"'"$param"'":{"type":"array","description":"","items": {"type":"string"}}}'
+ elif [[ "$param" == *'*' ]]; then
+ param="${param:0:$((${#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:0:$((${#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