aboutsummaryrefslogtreecommitdiffstats
path: root/scripts
diff options
context:
space:
mode:
Diffstat (limited to 'scripts')
-rwxr-xr-x[-rw-r--r--]scripts/build-declarations.js0
-rwxr-xr-x[-rw-r--r--]scripts/build-declarations.py0
-rwxr-xr-xscripts/declarations-util.sh133
3 files changed, 133 insertions, 0 deletions
diff --git a/scripts/build-declarations.js b/scripts/build-declarations.js
index 37b840e..37b840e 100644..100755
--- a/scripts/build-declarations.js
+++ b/scripts/build-declarations.js
diff --git a/scripts/build-declarations.py b/scripts/build-declarations.py
index 72b6aff..72b6aff 100644..100755
--- a/scripts/build-declarations.py
+++ b/scripts/build-declarations.py
diff --git a/scripts/declarations-util.sh b/scripts/declarations-util.sh
new file mode 100755
index 0000000..2a0929d
--- /dev/null
+++ b/scripts/declarations-util.sh
@@ -0,0 +1,133 @@
+#!/usr/bin/env bash
+
+set -e
+
+# @cmd Pretty print declarations
+#
+# Examples:
+# ./scripts/declarations.sh pretty-print functions.json
+# cat functions.json | ./scripts/declarations.sh pretty-print functions.json
+# @flag --no-type Do not to display param type info
+# @arg json-file The json file, Read stdin if omitted
+pretty-print() {
+ _run _pretty_print
+}
+
+# @cmd Generate placeholder json according to declarations
+# Examples:
+# ./scripts/declarations.sh generate-json-data functions.json
+# cat functions.json | ./scripts/declarations.sh generate-json-data functions.json
+# @arg json-file The json file, Read stdin if omitted
+generate-json() {
+ _run _generate_json
+}
+
+_run() {
+ func="$1"
+ _get_declarations_data
+ if [[ "$json_type" == "object" ]]; then
+ echo "$json_data" | $func
+ elif [[ "$json_type" == "array" ]]; then
+ for i in $(seq 1 $json_array_len); do
+ echo "$json_data" | jq '.['$((i-1))']' | $func
+ done
+ fi
+}
+
+_get_declarations_data() {
+ if [[ -f "$argc_json_file" ]]; then
+ json_data="$(cat "$argc_json_file")"
+ else
+ json_data="$(cat)"
+ fi
+ json_type="$(echo "$json_data" | jq -r '
+if type == "array" then
+ (. | length) as $len | "array;\($len)"
+else
+ if type == "object" then
+ type
+ else
+ ""
+ end
+end
+' 2>/dev/null || true)"
+ if [[ "$json_type" == *object* ]]; then
+ :;
+ elif [[ "$json_type" == *array* ]]; then
+ json_array_len="${json_type#*;}"
+ json_type="${json_type%%;*}"
+ if [[ ! "$json_array_len" -gt 0 ]]; then
+ json_type=""
+ fi
+ fi
+ if [[ -z "$json_type" ]]; then
+ echo "invalid JSON data"
+ exit 1
+ fi
+}
+
+_pretty_print() {
+ jq --arg no_type "$argc_no_type" -r '
+def get_type:
+ .value.type as $type |
+ (if .required then "" else "?" end) as $symbol |
+ (.value.enum // []) as $enum |
+ ([
+ { condition: ($type == "array"), result: "string[]" },
+ { condition: ($type == "string" and ($enum | length > 0)), result: ($enum | join("|")) },
+ { condition: ($type == "string"), result: "" },
+ { condition: true, result: $type }
+ ] | map(select(.condition) | .result) | first) as $kind |
+ if $kind != "" then "(\($kind))\($symbol)" else $symbol end;
+
+def oneline_description: split("\n")[0];
+
+def parse_property:
+ .key as $key |
+ (.value.description | oneline_description) as $description |
+ (if $no_type != "1" then (. | get_type) else "" end) as $type |
+ " \($key)\($type): \($description)";
+
+def print_params:
+ .parameters |
+ .required as $requiredProperties |
+ .properties | to_entries[] |
+ .key as $key | .+ { "required": ($requiredProperties | index($key) != null) } |
+ parse_property;
+
+def print_title:
+ (.description | oneline_description) as $description |
+ "\(.name): \($description)";
+
+print_title, print_params
+'
+}
+
+_generate_json() {
+ jq -r -c '
+def convert_string:
+ if has("enum") then .enum[0] else "foo" end;
+
+def parse_property:
+ .key as $key |
+ .value.type as $type |
+ [
+ { condition: ($type == "string"), result: { $key: (.value | convert_string) }},
+ { condition: ($type == "boolean"), result: { $key: false }},
+ { condition: ($type == "integer"), result: { $key: 42 }},
+ { condition: ($type == "number"), result: { $key: 3.14 }},
+ { condition: ($type == "array"), result: { $key: [ "v1" ] } }
+ ] | map(select(.condition) | .result) | first;
+
+.name,
+(
+ .parameters |
+ [
+ .properties | to_entries[] | parse_property
+ ] | add // {}
+)
+'
+}
+
+# See more details at https://github.com/sigoden/argc
+eval "$(argc --argc-eval "$0" "$@")"