canonical_id: "switch"
display_name: "條件路由"
category: "logic"
version: "v1"
wasi_target: "preview1"
stability: "floating"
runtime_compat:
  - "cf-workers"
  - "workerd"
  - "wazero"
constraints:
  max_size_kb: 2048
  max_cold_start_ms: 50
  no_network_syscall: true
  no_filesystem_syscall: true
  io_model: "stdin_stdout_json"
input_schema:
  type: object
  required: [value, cases]
  properties:
    value:
      type: string
      description: 要比對的值
    cases:
      type: array
      items:
        type: object
        properties:
          match:
            type: string
          branch:
            type: string
    default_branch:
      type: string
      description: 無匹配時的預設分支
output_schema:
  type: object
  properties:
    success:
      type: boolean
    data:
      type: object
      properties:
        branch:
          type: string
gherkin_tests:
  - scenario: "匹配到 case"
    given: '{"value":"a","cases":[{"match":"a","branch":"branch_a"}],"default_branch":"default"}'
    then_contains: '"branch":"branch_a"'
  - scenario: "走 default 分支"
    given: '{"value":"z","cases":[{"match":"a","branch":"branch_a"}],"default_branch":"fallback"}'
    then_contains: '"branch":"fallback"'
  - scenario: "無效 JSON"
    given: 'not-json'
    then_contains: '{"success":false'
tags: [builtin, switch, branch, route, condition]
description: "依值路由到對應分支，支援多個 case 和 default 分支。"
config_example: |
  my_switch:                          # 節點名稱（可自訂）
    value: "{{upstream.status}}"      # 要比對的值（必填）
    cases:                            # case 清單（必填）
      - match: active                 # 比對值
        branch: branch_active         # 對應分支名稱
      - match: inactive
        branch: branch_inactive
    default_branch: branch_default    # 無匹配時的預設分支（選填）
