select_fixture_families() { local requested=("$@") local family local candidate local found local use_all=false FIXTURE_FAMILIES=() if [[ "${#requested[@]}" = 0 ]]; then requested=(all) fi for family in "${requested[@]}"; do case "$family" in all) use_all=true ;; base | durable | coordination | oidc | target) ;; *) printf 'unknown fixture family: %s\n' "$family" >&2 return 1 ;; esac done if [[ "$use_all" = true ]]; then requested=(durable coordination oidc target) fi for candidate in durable coordination oidc target; do found=false for family in "${requested[@]}"; do if [[ "$family" = "$candidate" ]]; then found=true fi done if [[ "$found" = true ]]; then FIXTURE_FAMILIES+=("$candidate") fi done } fixture_has_family() { local expected="$1" local family for family in "${FIXTURE_FAMILIES[@]}"; do if [[ "$family" = "$expected" ]]; then return fi done return 1 } expand_fixture_matrix() { local coordination_providers=(-) local oidc_providers=(-) local target_providers=(-) local coordination local oidc local target local lane=0 select_fixture_families "$@" || return if fixture_has_family coordination; then coordination_providers=(redis dragonfly) fi if fixture_has_family oidc; then oidc_providers=(keycloak zitadel) fi if fixture_has_family target; then target_providers=(garage versitygw) fi for coordination in "${coordination_providers[@]}"; do for oidc in "${oidc_providers[@]}"; do for target in "${target_providers[@]}"; do lane=$((lane + 1)) printf '%03d\t%s\t%s\t%s\n' "$lane" "$coordination" "$oidc" "$target" done done done }