Bash Code Generation
paradox generate --bash [--path PATH]
Product Types
Input:
type Person
name: Text
age: Integer
admin: Boolean
Output:
#!/usr/bin/env bash
set -euo pipefail
# Product type: Person
# Fields: name (string), age (integer), admin (boolean)
# Constructor: mk_<name> field1 field2 ...
mk_person() {
local -n __result=$1
shift
__result["name"]="$1"; shift
__result["age"]="$1"; shift
__result["admin"]="$1"; shift
}
# Getter: get_<name>_<field> array_name
get_person_name() {
local -n __arr=$1
echo "${__arr["name"]}"
}
get_person_age() {
local -n __arr=$1
echo "${__arr["age"]}"
}
get_person_admin() {
local -n __arr=$1
echo "${__arr["admin"]}"
}
Products use Bash associative arrays. Constructors (mk_*) populate fields; getters (get_*_*) retrieve them.
Validators
valid_person() {
local -n __x=$1
local -a __errors=()
true || __errors+=("field 'name' must be string")
[[ ${__x["age"]} =~ ^-?[0-9]+$ ]] || __errors+=("field 'age' must be integer")
[[ ${__x["admin"]} == "true" || ${__x["admin"]} == "false" ]] || \
__errors+=("field 'admin' must be boolean")
if [[ ${#__errors[@]} -gt 0 ]]; then
local IFS='; '
echo "${__errors[*]}" >&2
return 1
fi
return 0
}
is_valid_person() {
valid_person "$@" 2>/dev/null
}
Validators use regex matching for type checks and return 0 (valid) or 1 (invalid).