cat /etc/wireguard/wgctl/commands/rule.command.sh | grep -A 50 "function cmd::rule::list"
function cmd::rule::list() {
  local rules_dir
  rules_dir="$(ctx::rules)"

  local rules=("${rules_dir}"/*.rule)
  if [[ ! -f "${rules[0]}" ]]; then
    log::wg "No rules configured"
    return 0
  fi

    local rules=("${rules_dir}"/*.rule)
    echo "DEBUG: first=${rules[0]}"
    echo "DEBUG: count=${#rules[@]}"

  log::section "Firewall Rules"

  printf "\n  %-20s %-35s %-8s %-8s %s\n" \
    "NAME" "DESCRIPTION" "ALLOWS" "BLOCKS" "PEERS"
  printf "  %s\n" "$(printf '─%.0s' {1..80})"

  for rule_file in "${rules_dir}"/*.rule; do
    [[ -f "$rule_file" ]] || continue

    local name desc peer_count
    name=$(json::get "$rule_file" "name")
    desc=$(json::get "$rule_file" "desc")

    local n_allows n_block_ips n_block_ports blocks

    n_allows=$(json::get "$rule_file" "allow_ips" | grep -v '^$' | wc -l | tr -d ' ')
    n_block_ips=$(json::get "$rule_file" "block_ips" | grep -v '^$' | wc -l | tr -d ' ')
    n_block_ports=$(json::get "$rule_file" "block_ports" | grep -v '^$' | wc -l | tr -d ' ')
    # wc -l returns 0 for empty, so this is safe

    blocks=$(( n_block_ips + n_block_ports ))

    # Count assigned peers
    peer_count=$(peers::with_rule "$name" | grep -c .)

    local short_desc="${desc:0:33}"
    [[ ${#desc} -gt 33 ]] && short_desc="${short_desc}..."

    printf "  %-20s %-36s %-8s %-8s %s\n" \
    "$name" \
    "${short_desc:-—}" \
    "${n_allows}" \
    "${blocks}" \
    "${peer_count} peers"
  done

  printf "\n"