@@ -25,67 +25,103 @@ bash_object.traverse-set() {
2525 flag_pass_by_what=' by-value'
2626 ;;
2727 --)
28+ # All arguments after '--' are in '$@'
2829 break
2930 ;;
3031 * )
3132 args+=(" $arg " )
3233 ;;
33- esac done
34+ esac ; shift ; done
3435
3536 if [ -z " $flag_pass_by_what " ]; then
3637 bash_object.util.die ' ERROR_ARGUMENTS_INVALID' " Must pass either the '--ref' or '--value' flag"
3738 return
3839 fi
3940
40- if [ " $flag_pass_by_what " = ' by-value' ]; then
41- bash_object.util.die ' ERROR_ARGUMENTS_INVALID' " --value not implemented"
42- # TODO:
43- # return
44- fi
45-
46- local final_value_type root_object_name querytree final_value
47- # for compat with 'set -u'
48- if [ -n " ${args[0]+x} " ]; then
49- final_value_type=" ${args[0]} "
50- fi
51- if [ -n " ${args[1]+x} " ]; then
52- root_object_name=" ${args[1]} "
53- fi
54- if [ -n " ${args[2]+x} " ]; then
55- querytree=" ${args[2]} "
56- fi
57- if [ -n " ${args[3]+x} " ]; then
58- final_value=" ${args[3]} "
59- fi
60-
61- # Ensure correct number of arguments have been passed
62- # Only do this for circumstances in which we know the correct argument amount
63- if [ " $flag_pass_by_what " = ' by-ref' ] && (( ${# args[@]} != 4 )) ; then
64- bash_object.util.die ' ERROR_ARGUMENTS_INVALID' " Expected '4' arguments, but received '${# args[@]} '"
65- return
66- elif [[ " $flag_pass_by_what " == ' by-value' && " $final_value_type " == ' string' ]] && (( ${# args[@]} != 4 )) ; then
67- bash_object.util.die ' ERROR_ARGUMENTS_INVALID' " Expected '4' arguments, but received '${# args[@]} '"
41+ if [ " $flag_pass_by_what " = ' by-ref' ]; then
42+ if (( ${# args[@]} != 4 )) ; then
43+ bash_object.util.die ' ERROR_ARGUMENTS_INVALID' " With '--ref', 4 arguments are expected (but received ${# args[@]} )"
44+ return
45+ fi
46+ elif [ " $flag_pass_by_what " = ' by-value' ]; then
47+ if (( ${# args[@]} != 3 )) ; then
48+ bash_object.util.die ' ERROR_ARGUMENTS_INVALID' " With '--value', 3 arguments are expected before '--' (but received ${# args[@]} )"
49+ return
50+ fi
51+ else
52+ bash_object.util.die ' ERROR_ARGUMENTS_INVALID' " Unexpected final_value_type '$final_value_type '"
6853 return
6954 fi
7055
56+ local final_value_type=" ${args[0]} "
57+ local root_object_name=" ${args[1]} "
58+ local querytree=" ${args[2]} "
59+
7160 # Ensure parameters are not empty
7261 if [ -z " $final_value_type " ]; then
73- bash_object.util.die ' ERROR_ARGUMENTS_INVALID' " Positional parameter '1' is empty. Please check passed parameters"
62+ bash_object.util.die ' ERROR_ARGUMENTS_INVALID' " Positional parameter 1 is empty. Please check passed parameters"
7463 return
7564 fi
7665 if [ -z " $root_object_name " ]; then
77- bash_object.util.die ' ERROR_ARGUMENTS_INVALID' " Positional parameter '2' is empty. Please check passed parameters"
66+ bash_object.util.die ' ERROR_ARGUMENTS_INVALID' " Positional parameter 2 is empty. Please check passed parameters"
7867 return
7968 fi
8069 if [ -z " $querytree " ]; then
81- bash_object.util.die ' ERROR_ARGUMENTS_INVALID' " Positional parameter '3' is empty. Please check passed parameters"
70+ bash_object.util.die ' ERROR_ARGUMENTS_INVALID' " Positional parameter 3 is empty. Please check passed parameters"
8271 return
8372 fi
84- if [[ " $flag_pass_by_what " == ' by-ref' && -z " $final_value " ]]; then
85- # Can only check if passing by ref, since we do not want to error if
86- # an empty string is passed (by value) or an array with empty string at
87- # index 0 is passed (by value)
88- bash_object.util.die ' ERROR_ARGUMENTS_INVALID' " Positional parameter '4' is empty. Please check passed parameters"
73+
74+ # Set final_value after we ensure 'final_value_type' is non-empty
75+ local final_value=
76+ if [ " $flag_pass_by_what " = ' by-ref' ]; then
77+ final_value=" ${args[3]} "
78+
79+ if [ -z " $final_value " ]; then
80+ bash_object.util.die ' ERROR_ARGUMENTS_INVALID' " Positional parameter 4 is empty. Please check passed parameters"
81+ return
82+ fi
83+ elif [ " $flag_pass_by_what " = ' by-value' ]; then
84+ if [ " $final_value_type " == object ]; then
85+ local -A temp_var_name=" __bash_object_${RANDOM} _$RANDOM "
86+ local -n temp_var=" $temp_var_name "
87+ if (( $# & 1 )) ; then
88+ bash_object.util.die ' ERROR_ARGUMENTS_INVALID' " When passing --value with set-object, an even number of values must be passed after the '--'"
89+ return
90+ fi
91+ for (( i= 0 ; i< $# ; i+ 2 )) ; do
92+ temp_var[" ${! i} " ]=" ${! i+1} "
93+ done
94+ elif [ " $final_value_type " == array ]; then
95+ local -a temp_var_name=" __bash_object_${RANDOM} _$RANDOM "
96+ local -n temp_var=" $temp_var_name "
97+ if [ " $1 " != -- ]; then
98+ bash_object.util.die ' ERROR_ARGUMENTS_INVALID' " '--' must be passed"
99+ return
100+ fi
101+ shift
102+ temp_var=(" $@ " )
103+ final_value=" $temp_var_name "
104+ elif [ " $final_value_type " == string ]; then
105+ local temp_var_name=" __bash_object_${RANDOM} _$RANDOM "
106+ local -n temp_var=" $temp_var_name "
107+ if [ " $1 " != -- ]; then
108+ bash_object.util.die ' ERROR_ARGUMENTS_INVALID' " '--' must be passed"
109+ return
110+ fi
111+ shift
112+
113+ if (( $# > 1 )) ; then
114+ bash_object.util.die ' ERROR_ARGUMENTS_INVALID' " When passing --value with set-string, only one value must be passed after the '--'"
115+ return
116+ fi
117+ temp_var=" $1 "
118+ final_value=" $temp_var_name "
119+ else
120+ bash_object.util.die ' ERROR_ARGUMENTS_INVALID' " Unexpected final_value_type '$final_value_type '"
121+ return
122+ fi
123+ else
124+ bash_object.util.die ' ERROR_ARGUMENTS_INVALID' " Unexpected final_value_type '$final_value_type '"
89125 return
90126 fi
91127
@@ -217,7 +253,8 @@ bash_object.traverse-set() {
217253 # shellcheck disable=SC2034
218254 global_array=(" ${array_to_copy_from[@]} " )
219255 elif [ " $final_value_type " = string ]; then
220- current_object[" $key " ]=" ${! final_value} "
256+ local -n string_to_copy_from=" $final_value "
257+ current_object[" $key " ]=" $string_to_copy_from "
221258 else
222259 bash_object.util.die ' ERROR_ARGUMENTS_INVALID_TYPE' " Unexpected final_value_type '$final_value_type '"
223260 return
0 commit comments