confz

git mirror of https://ccx.te2000.cz/bzr/confz
git clone https://ccx.te2000.cz/git/confz
Log | Files | Refs

commit 07a98ca766aedbddf2984e54e8b06ae94b81d5fe
parent 81e681c48ac8bb8f15fef0f5ff693a23de3a956c
Author: Jan Pobrislo <ccx@webprojekty.cz>
Date:   Thu, 26 Jun 2014 21:27:11 +0200

conditional variable passing, error out gracefully on undefined variables
Diffstat:
Mbin/confz | 13++++++++++++-
1 file changed, 12 insertions(+), 1 deletion(-)

diff --git a/bin/confz b/bin/confz @@ -96,6 +96,10 @@ require() { # <variables> are variable assignments in the form of: # foo=bar -- sets ${vars[foo]} in calee to value "bar" # :foo -- passes ${vars[foo]} from caller to calee + # ?foo=bar -- sets ${vars[foo]} in calee to value of ${vars[bar]} + # iff it is defined in the caller + # ?foo -- passes ${vars[foo]} from caller to calee iff it is defined + # in the caller # %foo -- passes ${vars[foo]} from callee to caller # %foo=bar -- passes ${vars[foo]} from callee # to variable ${vars[bar]} of caller @@ -119,7 +123,12 @@ require() { # parse variable assignments while (( $# )); do case $1 in - (:*) setvar ${1#:} ${vars_prev[${1#:}]};; + (:*) ((${+vars_prev[${1#:}]})) || \ + die "variable ${(qqq)1#:} not set, passed as :argument" + setvar ${1#:} ${vars_prev[${1#:}]};; + (\?*=*) (($+vars_prev[${${1#\?}#*=})) && \ + setvar ${${1#\?}%%=*} $vars_prev[${${1#\?}#*=};; + (\?*) setvar ${1#\?} ${vars_prev[${1#\?}]};; (%*=*) lift[${${1#%}%%=*}]=${${1#%}#*=};; (%*) lift[${1#%}]=${1#%};; (*=*) setvar ${1%%=*} ${1#*=};; @@ -185,6 +194,8 @@ require() { # lift %variables from calee to caller for outer inner in ${(kv)lift}; do + ((${+vars_prev[$inner]})) || \ + die "variable ${(qqq)inner} not set, was requested by caller as ${(qqq)outer}" setvar $outer ${vars_prev[$inner]} done }