Added array element interpolation

This commit is contained in:
Joseph Dalrymple 2023-04-18 18:04:15 -05:00
parent 7604ce3054
commit 05499bd6cd
2 changed files with 62 additions and 8 deletions

38
mo
View File

@ -1070,7 +1070,7 @@ mo::getArgument() {
;;
*)
mo::getArgumentDefault moArg "$moContent" "$moClosingDelimiter"
mo::getArgumentDefault moArg "$moContent" "$moCurrent" "$moClosingDelimiter"
esac
mo::debug "Found argument: ${moArg[0]} ${moArg[1]}"
@ -1237,6 +1237,8 @@ mo::getArgumentSingleQuote() {
#
# $1 - Destination variable name, an array with two elements
# $2 - Content
# $3 - Current
# $4 - Closing delimiter
#
# The array has the following elements.
# [0] = argument type, "NAME" or "VALUE"
@ -1245,16 +1247,36 @@ mo::getArgumentSingleQuote() {
#
# Returns nothing.
mo::getArgumentDefault() {
local moTemp moContent
local moTemp moArgInner moArgParsed moBraceChunk moBreakChunk moTempBefore moContent
moTemp=$2
mo::chomp moTemp "${moTemp%%"$3"*}"
moTemp=${moTemp%%)*}
moTemp=${moTemp%%\}*}
mo::chomp moTemp "$2"
moContent=${2:${#moTemp}}
mo::debug "Parsed default argument: $moTemp"
while :; do
case "$moTemp" in
*'{'*)
moBreakChunk="${moTemp%%"$4"*}"
moBraceChunk="${moTemp%%\{*}"
[[ ${#moBreakChunk} -le ${#moBraceChunk} ]] && break;
local "$1" && mo::indirectArray "$1" "NAME" "$moTemp" "$moContent"
moTempBefore="${moTemp%\{*}"
moArgInner="${moTemp:${#moTempBefore}}"
mo::getArgumentBrace moArgParsed "$moArgInner" "$3" '}'
moTemp="$moTempBefore${moArgParsed[1]}${moArgParsed[2]}"
;;
*)
break;
;;
esac
done
mo::chomp moArgParsed "${moTemp%%"$4"*}"
moArgParsed=${moArgParsed%%)*}
moArgParsed=${moArgParsed%%\}*}
moContent=${moTemp:${#moArgParsed}}$moContent
mo::debug "Parsed default argument: $moArgParsed"
local "$1" && mo::indirectArray "$1" "NAME" "$moArgParsed" "$moContent"
}

32
tests/array-element-ref Executable file
View File

@ -0,0 +1,32 @@
#!/usr/bin/env bash
cd "${0%/*}" || exit 1
. ../run-tests
MO_ALLOW_FUNCTION_ARGUMENTS=true
i=2
k="bar"
arrname="repo"
declare -a repo
repo=( "resque" "hub" "rip" )
declare -A assoc
assoc[foo]="111"
assoc[bar]="222"
assoc[baz]="333"
template() {
cat <<EOF
Specific Array Element: {{repo.{i}}}!
Specific Array Element: {{assoc.{k}}}!
EOF
}
expected() {
cat <<EOF
Specific Array Element: rip!
Specific Array Element: 222!
EOF
}
runTest