feat: js/py generate declarations from comments (#30)

This commit is contained in:
sigoden
2024-06-07 15:16:31 +08:00
committed by GitHub
parent 2b07fc2c7e
commit 739a832d87
14 changed files with 717 additions and 272 deletions
+84 -14
View File
@@ -1,17 +1,20 @@
#!/usr/bin/env bash
set -e
# @describe Create a boilplate tool script file.
# @describe Create a boilplate tool scriptfile.
#
# 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*
#
# @flag --force Override the exist tool file
# @arg name! The script file name.
# @arg params* The script parameters
main() {
output="tools/$argc_name"
if [[ -f "$output" ]]; then
if [[ -f "$output" ]] && [[ -z "$argc_force" ]]; then
_die "$output already exists"
fi
ext="${argc_name##*.}"
@@ -25,6 +28,7 @@ main() {
py) create_py ;;
*) _die "Invalid extension name: $ext, must be one of ${support_exts[*]}" ;;
esac
_die "$output generated"
}
create_sh() {
@@ -49,25 +53,91 @@ EOF
}
create_js() {
properties=''
for param in "${argc_params[@]}"; do
if [[ "$param" == *'!' ]]; then
param="${param:0:$((${#param}-1))}"
property=" * @property {string} $param - "
elif [[ "$param" == *'+' ]]; then
param="${param:0:$((${#param}-1))}"
property=" * @property {string[]} $param - "
elif [[ "$param" == *'*' ]]; then
param="${param:0:$((${#param}-1))}"
property=" * @property {string[]} [$param] - "
else
property=" * @property {string} [$param] - "
fi
properties+=$'\n'"$property"
done
cat <<EOF > "$output"
exports.declarate = function declarate() {
return $(build_schema)
}
exports.execute = function execute(data) {
console.log(data)
/**
*
* @typedef {Object} Args${properties}
* @param {Args} args
*/
exports.main = function main(args) {
console.log(args);
}
EOF
}
create_py() {
has_array_param=false
has_optional_pram=false
required_properties=''
optional_properties=''
required_arguments=()
optional_arguments=()
indent=" "
for param in "${argc_params[@]}"; do
optional=false
if [[ "$param" == *'!' ]]; then
param="${param:0:$((${#param}-1))}"
type="str"
elif [[ "$param" == *'+' ]]; then
param="${param:0:$((${#param}-1))}"
type="List[str]"
has_array_param=true
elif [[ "$param" == *'*' ]]; then
param="${param:0:$((${#param}-1))}"
type="Optional[List[str]] = None"
optional=true
has_array_param=true
else
optional=true
type="Optional[str] = None"
fi
if [[ "$optional" == "true" ]]; then
has_optional_pram=true
optional_arguments+="$param: $type, "
optional_properties+=$'\n'"$indent$indent$param: -"
else
required_arguments+="$param: $type, "
required_properties+=$'\n'"$indent$indent$param: -"
fi
done
import_typing_members=()
if [[ "$has_array_param" == "true" ]]; then
import_typing_members+=("List")
fi
if [[ "$has_optional_pram" == "true" ]]; then
import_typing_members+=("Optional")
fi
imports=""
if [[ -n "$import_typing_members" ]]; then
members="$(echo "${import_typing_members[*]}" | sed 's/ /, /')"
imports="from typing import $members"$'\n'
fi
if [[ -n "$imports" ]]; then
imports="$imports"$'\n'
fi
cat <<EOF > "$output"
def declarate():
return $(build_schema)
def execute(data):
print(data)
${imports}
def main(${required_arguments}${optional_arguments}):
"""
Args:${required_properties}${optional_properties}
"""
pass
EOF
}