changeset 717:f4725ad5cd21

farray.sh: type tests for array and alist
author Franz Glasner <fzglas.hg@dom66.de>
date Fri, 04 Oct 2024 17:18:14 +0200
parents 36d953791e0c
children 2502e077d5e9
files share/local-bsdtools/farray.sh tests/farray-alist.t tests/farray-array.t
diffstat 3 files changed, 142 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/share/local-bsdtools/farray.sh	Fri Oct 04 15:45:51 2024 +0200
+++ b/share/local-bsdtools/farray.sh	Fri Oct 04 17:18:14 2024 +0200
@@ -357,6 +357,80 @@
 
 
 #:
+#: Internal implementation of typing
+#:
+#: Args:
+#:   $1 (str): The name of an object
+#:
+#: Output (stdout):
+#:   - array: an array
+#:   - alist: an alist
+#:   - null: an empty thing
+#:   - value: some other shell type (string, number, ...)
+#:   - unknown: if the name in `$1` was not given
+#:
+#: Returns:
+#:   int: 0 always
+#:
+_farr_type() {
+    local __farr_type_name
+
+    local __farr_type_token
+
+    __farr_type_name="${1-}"
+    if [ -n "${__farr_type_name}" ] ; then
+        eval __farr_type_token=\"\$\{"${__farr_type_name}"+SET\}\"
+        if [ "${__farr_type_token}" = 'SET' ] ; then
+            if eval __farr_type_token=\"\$\{"${__farr_type_name}"\}\" ; then
+                case "${__farr_type_token}" in
+                    '')
+                        printf '%s' 'null';;
+                    "${_farr_array_token_prefix}"*)
+                        printf '%s' 'array';;
+                    "${_farr_alist_token_prefix}"*)
+                        printf '%s' 'alist';;
+                    *)
+                        printf '%s' 'value';;
+                esac
+            else
+                # error in evaluation
+                printf '%s' 'error'
+            fi
+        else
+            # unset
+            printf '%s' 'unknown'
+        fi
+    else
+        # no name given
+        printf '%s' 'unknown'
+    fi
+    return 0
+}
+
+
+#:
+#: Just an official alias for `_farr_type`
+#:
+farray_type() {
+    _farr_type "$@"
+}
+
+
+#:
+#: Test whether `$1` is an array.
+#:
+#: Args:
+#:   $1 (str): The name of an object
+#:
+#: Returns:
+#:   int: 0 if `$1` is an array, 1 otherwise
+#:
+farray_isarray() {
+    [ "$(_farr_type "$@")" = 'array' ]
+}
+
+
+#:
 #: Create a new array.
 #:
 #: It is assumed that the array does not exist already.
@@ -1391,6 +1465,28 @@
 
 
 #:
+#: Just an official alias for `_farr_type`
+#:
+falist_type() {
+    _farr_type "$@"
+}
+
+
+#:
+#: Test whether `$1` is an alist.
+#:
+#: Args:
+#:   $1 (str): The name of an object
+#:
+#: Returns:
+#:   int: 0 if `$1` is an alist, 1 otherwise
+#:
+falist_isalist() {
+    [ "$(_farr_type "$@")" = 'alist' ]
+}
+
+
+#:
 #: Create a new alist.
 #:
 #: Args:
--- a/tests/farray-alist.t	Fri Oct 04 15:45:51 2024 +0200
+++ b/tests/farray-alist.t	Fri Oct 04 17:18:14 2024 +0200
@@ -373,3 +373,26 @@
   [70]
   $ falist_destroy LIST
   $ check_no_alist_artifacts
+
+
+Other Type Checks
+=================
+
+  $ falist_type
+  unknown (no-eol)
+  $ falist_type __UNKNOWN_VARIABLE__
+  unknown (no-eol)
+  $ testvar='foo'
+  $ falist_type testvar
+  value (no-eol)
+  $ testvar=''
+  $ falist_type testvar
+  null (no-eol)
+  $ falist_isalist testvar
+  [1]
+  $ falist_create LIST
+  $ falist_type LIST
+  alist (no-eol)
+  $ falist_isalist LIST
+  $ falist_destroy LIST
+  $ check_no_alist_artifacts
--- a/tests/farray-array.t	Fri Oct 04 15:45:51 2024 +0200
+++ b/tests/farray-array.t	Fri Oct 04 17:18:14 2024 +0200
@@ -1022,3 +1022,26 @@
   [70]
   $ farray_destroy TEST
   $ check_no_array_artifacts
+
+
+Other Type Checks
+=================
+
+  $ farray_type
+  unknown (no-eol)
+  $ farray_type __UNKNOWN_VARIABLE__
+  unknown (no-eol)
+  $ testvar='foo'
+  $ farray_type testvar
+  value (no-eol)
+  $ testvar=''
+  $ farray_type testvar
+  null (no-eol)
+  $ farray_isarray testvar
+  [1]
+  $ farray_create TEST
+  $ falist_type TEST
+  array (no-eol)
+  $ farray_isarray TEST
+  $ farray_destroy TEST
+  $ check_no_array_artifacts