Skip to content

Commit 0fc85d3

Browse files
committed
feat: Require '--as-<ref|value>' flag for get
This also fixes some things in other places
1 parent ea81a24 commit 0fc85d3

15 files changed

+203
-100
lines changed

README.md

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -32,16 +32,16 @@ bobject set-object --by-ref root_object '.zulu.yankee' yankee_object
3232
bobject set-object --by-ref root_object '.zulu.yankee.xray' xray_object
3333
bobject set-array --by-ref root_object '.zulu.yankee.xray.foxtrot' foxtrot_array
3434

35-
bobject get-object root_object '.zulu.yankee.xray'
35+
bobject get-object --as-value root_object '.zulu.yankee.xray'
3636
assert [ "${REPLY[whiskey]}" = victor ]
3737

38-
bobject get-string root_object '.zulu.yankee.xray.whiskey'
38+
bobject get-string --as-value root_object '.zulu.yankee.xray.whiskey'
3939
assert [ "$REPLY" = victor ]
4040

41-
bobject get-array root_object '.zulu.yankee.xray.foxtrot'
41+
bobject get-array --as-value root_object '.zulu.yankee.xray.foxtrot'
4242
assert [ ${#REPLY[@]} -eq 4 ]
4343

44-
bobject get-string root_object '.["zulu"].["yankee"].["xray"].["foxtrot"].[2]'
44+
bobject get-string --as-value root_object '.["zulu"].["yankee"].["xray"].["foxtrot"].[2]'
4545
assert [ "$REPLY" = rho ]
4646
```
4747

@@ -58,4 +58,4 @@ bpm install
5858
- error on invalid references (`type=object` in virtual object metadata, when it is referencing an array)
5959
- ensure error (for set primarily) if the virtual object references a variable that does not exist
6060
- "queried for X, but found existing object": print object in error (same with indexed arrays)
61-
--reply-with-value
61+
- use ${param@A} on newer bash instead of declare -p

docs/unmarshaling.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ declare -A OBJECT=([xray]=$'\x1C\x1Dtype=object;&unique_global_variable_xray')
6666
You can retrieve the data with
6767

6868
```sh
69-
bobject get-object 'OBJECT' 'xray'
69+
bobject get-object --as-value 'OBJECT' 'xray'
7070
assert [ "${REPLY[yankee]}" = zulu ]
7171
```
7272

pkg/lib/traverse-get.sh

Lines changed: 39 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8,30 +8,61 @@ bash_object.traverse-get() {
88
stdtrace.log 0 "CALL: bash_object.traverse-get: $*"
99
fi
1010

11-
local final_value_type="$1"
12-
local root_object_name="$2"
13-
local filter="$3"
11+
local flag_as_what=''
12+
local -a args=()
13+
14+
for arg; do case "$arg" in
15+
--as-ref)
16+
if [ -n "$flag_as_what" ]; then
17+
bash_object.util.die 'ERROR_ARGUMENTS_INVALID' "Flags '--as-ref' and '--as-value' are mutually exclusive"
18+
return
19+
fi
20+
flag_as_what='as-ref'
21+
;;
22+
--as-value)
23+
if [ -n "$flag_as_what" ]; then
24+
bash_object.util.die 'ERROR_ARGUMENTS_INVALID' "Flags '--as-ref' and '--as-value' are mutually exclusive"
25+
return
26+
fi
27+
flag_as_what='as-value'
28+
;;
29+
--)
30+
break
31+
;;
32+
*)
33+
args+=("$arg")
34+
;;
35+
esac done
36+
37+
if [ -z "$flag_as_what" ]; then
38+
bash_object.util.die 'ERROR_ARGUMENTS_INVALID' "Must pass either the '--as-ref' or '--as-value' flag"
39+
return
40+
fi
1441

1542
# Ensure correct number of arguments have been passed
16-
if (( $# != 3)); then
17-
bash_object.util.die 'ERROR_ARGUMENTS_INVALID' "Expected '3' arguments, but received '$#'"
43+
if (( ${#args[@]} != 3)); then
44+
bash_object.util.die 'ERROR_ARGUMENTS_INVALID' "Expected '3' arguments, but received '${#args[@]}'"
1845
return
1946
fi
2047

2148
# Ensure parameters are not empty
22-
if [ -z "$final_value_type" ]; then
49+
if [ -z "${args[0]}" ]; then
2350
bash_object.util.die 'ERROR_ARGUMENTS_INVALID' "Positional parameter '1' is empty. Please check passed parameters"
2451
return
2552
fi
26-
if [ -z "$root_object_name" ]; then
53+
if [ -z "${args[1]}" ]; then
2754
bash_object.util.die 'ERROR_ARGUMENTS_INVALID' "Positional parameter '2' is empty. Please check passed parameters"
2855
return
2956
fi
30-
if [ -z "$filter" ]; then
57+
if [ -z "${args[2]}" ]; then
3158
bash_object.util.die 'ERROR_ARGUMENTS_INVALID' "Positional parameter '3' is empty. Please check passed parameters"
3259
return
3360
fi
3461

62+
local final_value_type="${args[0]}"
63+
local root_object_name="${args[1]}"
64+
local filter="${args[2]}"
65+
3566
# Start traversing at the root object
3667
local current_object_name="$root_object_name"
3768
local -n current_object="$root_object_name"

pkg/lib/traverse-set.sh

Lines changed: 37 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -10,29 +10,55 @@ bash_object.traverse-set() {
1010
local -a args=()
1111

1212
for arg; do case "$arg" in
13-
--by-ref) flag_pass_by_what='by-ref'; shift ;;
14-
--by-value) flag_pass_by_what='by-value'; shift ;;
15-
--) shift; break ;;
16-
*) args+=("$arg") ;;
13+
--by-ref)
14+
if [ -n "$flag_pass_by_what" ]; then
15+
bash_object.util.die 'ERROR_ARGUMENTS_INVALID' "Flags '--by-ref' and '--by-value' are mutually exclusive"
16+
return
17+
fi
18+
flag_pass_by_what='by-ref'
19+
;;
20+
--by-value)
21+
if [ -n "$flag_pass_by_what" ]; then
22+
bash_object.util.die 'ERROR_ARGUMENTS_INVALID' "Flags '--by-ref' and '--by-value' are mutually exclusive"
23+
return
24+
fi
25+
flag_pass_by_what='by-value'
26+
;;
27+
--)
28+
break
29+
;;
30+
*)
31+
args+=("$arg")
32+
;;
1733
esac done
1834

1935
if [ -z "$flag_pass_by_what" ]; then
2036
bash_object.util.die 'ERROR_ARGUMENTS_INVALID' "Must pass either the '--by-ref' or '--by-value' flag"
2137
return
2238
fi
2339

24-
local final_value_type="${args[0]}"
25-
local root_object_name="${args[1]}"
26-
local filter="${args[2]}"
27-
local final_value="${args[3]}"
40+
local final_value_type root_object_name filter final_value
41+
# `set -u` compat
42+
if [ -n "${args[0]+x}" ]; then
43+
final_value_type="${args[0]}"
44+
fi
45+
if [ -n "${args[1]+x}" ]; then
46+
root_object_name="${args[1]}"
47+
fi
48+
if [ -n "${args[2]+x}" ]; then
49+
filter="${args[2]}"
50+
fi
51+
if [ -n "${args[3]+x}" ]; then
52+
final_value="${args[3]}"
53+
fi
2854

29-
# Ensure correct number of arguments have been passed. Only do this
30-
# for circumstances in which we know the correct argument amount
55+
# Ensure correct number of arguments have been passed
56+
# Only do this for circumstances in which we know the correct argument amount
3157
if [ "$flag_pass_by_what" = 'by-ref' ] && (( ${#args[@]} != 4)); then
3258
bash_object.util.die 'ERROR_ARGUMENTS_INVALID' "Expected '4' arguments, but received '${#args[@]}'"
3359
return
3460
elif [[ "$flag_pass_by_what" == 'by-value' && "$final_value_type" == 'string' ]] && (( ${#args[@]} != 4 )); then
35-
bash_object.util.die 'ERROR_ARGUMENTS_INVALID' "Expected '4' arguments, but received '$#'"
61+
bash_object.util.die 'ERROR_ARGUMENTS_INVALID' "Expected '4' arguments, but received '${#args[@]}'"
3662
return
3763
fi
3864

tests/e2e.bats

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ load './util/init.sh'
88
for subcmd in "${subcmds[@]}"; do
99
declare -A OBJECT=()
1010

11-
run bobject "$subcmd" 'OBJECT' '.zulu.yankee' 'invalid'
11+
run bobject "$subcmd" --as-value 'OBJECT' '.zulu.yankee' 'invalid'
1212

1313
assert_failure
1414
assert_line -p "Expected '3' arguments, but received '4'"
@@ -21,7 +21,7 @@ load './util/init.sh'
2121
for subcmd in "${subcmds[@]}"; do
2222
declare -A OBJECT=()
2323

24-
run bobject "$subcmd" 'invalid'
24+
run bobject "$subcmd" --as-value 'invalid'
2525

2626
assert_failure
2727
assert_failure
@@ -62,7 +62,7 @@ load './util/init.sh'
6262

6363
bobject set-object --by-ref 'OBJECT' '.zulu' subobj
6464
bobject set-string --by-ref 'OBJECT' '.zulu.yankee' str
65-
bobject get-string 'OBJECT' '.zulu.yankee'
65+
bobject get-string --as-value 'OBJECT' '.zulu.yankee'
6666

6767
assert [ "$REPLY" = 'MEOW' ]
6868
}
@@ -74,7 +74,7 @@ load './util/init.sh'
7474

7575
bobject set-object --by-ref 'OBJECT' '.zulu' subobj
7676
bobject set-string --by-ref 'OBJECT' '.["zulu"].["yankee"]' str
77-
bobject get-string 'OBJECT' '.["zulu"].["yankee"]'
77+
bobject get-string --as-value 'OBJECT' '.["zulu"].["yankee"]'
7878

7979
assert [ "$REPLY" = 'MEOW' ]
8080
}
@@ -91,15 +91,15 @@ load './util/init.sh'
9191
bobject set-object --by-ref root_object '.zulu.yankee.xray' xray_object
9292
bobject set-array --by-ref root_object '.zulu.yankee.xray.foxtrot' foxtrot_array
9393

94-
bobject get-object root_object '.zulu.yankee.xray'
94+
bobject get-object --as-value root_object '.zulu.yankee.xray'
9595
assert [ "${REPLY[whiskey]}" = victor ]
9696

97-
bobject get-string root_object '.zulu.yankee.xray.whiskey'
97+
bobject get-string --as-value root_object '.zulu.yankee.xray.whiskey'
9898
assert [ "$REPLY" = victor ]
9999

100-
bobject get-array root_object '.zulu.yankee.xray.foxtrot'
100+
bobject get-array --as-value root_object '.zulu.yankee.xray.foxtrot'
101101
assert [ ${#REPLY[@]} -eq 4 ]
102102

103-
bobject get-string root_object '.["zulu"].["yankee"].["xray"].["foxtrot"].[2]'
103+
bobject get-string --as-value root_object '.["zulu"].["yankee"].["xray"].["foxtrot"].[2]'
104104
assert [ "$REPLY" = rho ]
105105
}

tests/error-circular-reference.bats renamed to tests/errors-circular-reference.bats

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ load './util/init.sh'
77
declare -A SUB_OBJECT=([nested]=$'\x1C\x1Dtype=object;&SUB_OBJECT')
88
declare -A OBJECT=([my_key]=$'\x1C\x1Dtype=object;&SUB_OBJECT')
99

10-
run bobject get-object OBJECT '.my_key.nested'
10+
run bobject get-object --as-value OBJECT '.my_key.nested'
1111

1212
assert_failure
1313
assert_line -p "ERROR_SELF_REFERENCE"
@@ -18,7 +18,7 @@ load './util/init.sh'
1818
declare -A SUB_OBJECT=([nested]=$'\x1C\x1Dtype=object;&SUB_OBJECT')
1919
declare -A OBJECT=([my_key]=$'\x1C\x1Dtype=object;&SUB_OBJECT')
2020

21-
run bobject get-object OBJECT '.my_key.nested.nested'
21+
run bobject get-object --as-value OBJECT '.my_key.nested.nested'
2222

2323
assert_failure
2424
assert_line -p "ERROR_SELF_REFERENCE"
@@ -29,7 +29,7 @@ load './util/init.sh'
2929
declare -a SUB_ARRAY=([nested]=$'\x1C\x1Dtype=array;&SUB_ARRAY')
3030
declare -A OBJECT=([my_key]=$'\x1C\x1Dtype=array;&SUB_ARRAY')
3131

32-
run bobject get-array OBJECT '.my_key.nested'
32+
run bobject get-array --as-value OBJECT '.my_key.nested'
3333

3434
assert_failure
3535
assert_line -p "ERROR_SELF_REFERENCE"
@@ -40,7 +40,7 @@ load './util/init.sh'
4040
declare -a SUB_ARRAY=([nested]=$'\x1C\x1Dtype=array;&SUB_ARRAY')
4141
declare -A OBJECT=([my_key]=$'\x1C\x1Dtype=array;&SUB_ARRAY')
4242

43-
run bobject get-array OBJECT '.my_key.nested.nested'
43+
run bobject get-array --as-value OBJECT '.my_key.nested.nested'
4444

4545
assert_failure
4646
assert_line -p "ERROR_SELF_REFERENCE"

tests/errors-required-flags.bats

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
#!/usr/bin/env bats
2+
3+
load './util/init.sh'
4+
5+
# get
6+
@test "get errors on missing flags" {
7+
run bobject get-string
8+
9+
assert_failure
10+
assert_line -p 'ERROR_ARGUMENTS_INVALID'
11+
assert_line -p "Must pass either the '--as-ref' or '--as-value' flag"
12+
}
13+
14+
@test "get errors on combining mutually exclusive flags" {
15+
run bobject get-string --as-value --as-ref
16+
17+
assert_failure
18+
assert_line -p 'ERROR_ARGUMENTS_INVALID'
19+
assert_line -p "Flags '--as-ref' and '--as-value' are mutually exclusive"
20+
}
21+
22+
# set
23+
@test "set errors on missing flags" {
24+
run bobject set-string
25+
26+
assert_failure
27+
assert_line -p 'ERROR_ARGUMENTS_INVALID'
28+
assert_line -p "Must pass either the '--by-ref' or '--by-value' flag"
29+
}
30+
31+
@test "set errors on combining mutually exclusive flags" {
32+
run bobject set-string --by-value --by-ref
33+
34+
assert_failure
35+
assert_line -p 'ERROR_ARGUMENTS_INVALID'
36+
assert_line -p "Flags '--by-ref' and '--by-value' are mutually exclusive"
37+
}

tests/get-errors-invalid-dereferenced-vobj-type.bats

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ load './util/init.sh'
1010
declare -a whatever=()
1111
declare -A OBJECT=([my_key]=$'\x1C\x1Dtype=object;&whatever')
1212

13-
run bobject get-object OBJECT '.my_key'
13+
run bobject get-object --as-value OBJECT '.my_key'
1414

1515
assert_failure
1616
assert_line -p "ERROR_VOBJ_INCORRECT_TYPE"
@@ -23,7 +23,7 @@ load './util/init.sh'
2323

2424
declare -A OBJECT=([my_key]=$'\x1C\x1Dtype=object;&whatever')
2525

26-
run bobject get-object OBJECT '.my_key'
26+
run bobject get-object --as-value OBJECT '.my_key'
2727

2828
assert_failure
2929
assert_line -p "ERROR_VOBJ_INCORRECT_TYPE"

0 commit comments

Comments
 (0)