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).