Files
interactive-env/lib/validate.sh
2026-03-10 00:14:14 -05:00

91 lines
2.7 KiB
Bash

#!/usr/bin/env bash
# Value validation helpers, keyed by @type annotation.
# Source this file; do not execute it directly.
# Requires colors.sh to be sourced first.
# validate_value <var_name> <value> <type> <required>
# Returns 0 if valid, 1 if invalid (prints a message to stderr).
validate_value() {
local var_name="$1"
local value="$2"
local type="$3"
local required="$4"
# Required check
if [[ "$required" == "true" && -z "$value" ]]; then
printf "${RED} Error: %s is required and cannot be empty.${NC}\n" "$var_name" >&2
return 1
fi
# No further validation needed for empty optional values
if [[ -z "$value" ]]; then
return 0
fi
case "$type" in
number)
if ! [[ "$value" =~ ^-?[0-9]+(\.[0-9]+)?$ ]]; then
printf "${RED} Error: Must be a number (got: %s).${NC}\n" "$value" >&2
return 1
fi
;;
bool)
case "${value,,}" in
true|false|yes|no|1|0|y|n) ;;
*)
printf "${RED} Error: Must be a boolean value (true/false/yes/no).${NC}\n" >&2
return 1
;;
esac
;;
url)
if ! [[ "$value" =~ ^https?:// ]]; then
printf "${YELLOW} Warning: Value doesn't look like a URL (expected http:// or https://).${NC}\n" >&2
# Warn only — allow the user to proceed
fi
;;
email)
if ! [[ "$value" =~ ^[^@[:space:]]+@[^@[:space:]]+\.[^@[:space:]]+$ ]]; then
printf "${RED} Error: Must be a valid email address (got: %s).${NC}\n" "$value" >&2
return 1
fi
;;
enum:*)
local options="${type#enum:}"
local valid=false
local IFS=','
local opt
for opt in $options; do
if [[ "$value" == "$opt" ]]; then
valid=true
break
fi
done
if [[ "$valid" == "false" ]]; then
printf "${RED} Error: Must be one of: %s (got: %s).${NC}\n" "$options" "$value" >&2
return 1
fi
;;
secret|string|*)
# No structural validation for these types
;;
esac
return 0
}
# normalize_bool <value>
# Converts a truthy/falsy string to canonical "true" or "false".
normalize_bool() {
case "${1,,}" in
true|yes|1|y) echo "true" ;;
false|no|0|n) echo "false" ;;
*) echo "$1" ;; # pass-through for validation to catch
esac
}