@@ -25,67 +25,103 @@ bash_object.traverse-set() {
25
25
flag_pass_by_what=' by-value'
26
26
;;
27
27
--)
28
+ # All arguments after '--' are in '$@'
28
29
break
29
30
;;
30
31
* )
31
32
args+=(" $arg " )
32
33
;;
33
- esac done
34
+ esac ; shift ; done
34
35
35
36
if [ -z " $flag_pass_by_what " ]; then
36
37
bash_object.util.die ' ERROR_ARGUMENTS_INVALID' " Must pass either the '--ref' or '--value' flag"
37
38
return
38
39
fi
39
40
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 '"
68
53
return
69
54
fi
70
55
56
+ local final_value_type=" ${args[0]} "
57
+ local root_object_name=" ${args[1]} "
58
+ local querytree=" ${args[2]} "
59
+
71
60
# Ensure parameters are not empty
72
61
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"
74
63
return
75
64
fi
76
65
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"
78
67
return
79
68
fi
80
69
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"
82
71
return
83
72
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 '"
89
125
return
90
126
fi
91
127
@@ -217,7 +253,8 @@ bash_object.traverse-set() {
217
253
# shellcheck disable=SC2034
218
254
global_array=(" ${array_to_copy_from[@]} " )
219
255
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 "
221
258
else
222
259
bash_object.util.die ' ERROR_ARGUMENTS_INVALID_TYPE' " Unexpected final_value_type '$final_value_type '"
223
260
return
0 commit comments