見出し画像

Step Functionsの入力値チェックについて

悩み

Step Functionsの入力値チェックのやり方について最近少し悩んでます
というのも入力必須(だったはずの)項目が設定されなかった場合でもデフォルト値を使って処理を行いたいという要望を受け、できないこともないので対応を行いましたがやり方がダサく、他に方法がないかゆるく探している次第です。
今から説明する方法よりスマートなやり方をご存知の方がいましたら教えてください…

現状のやり方

簡単に説明すると下記のような感じでChoicesを利用し、特定の項目が`"IsPresent": false`だった場合はデフォルト値を詰め込む処理にいき、設定済だった場合は設定値をそのまま使うというものになります

            "Mandatory1が設定されているかチェック": {
              "Type": "Choice",
              "Choices": [
                {
                  "Variable": "$.input.mandatory1",
                  "IsPresent": false,
                  "Next": "Mandatory1が設定されていない場合"
                }
              ],
              "Default": "Mandatory1が設定されていた場合"
            },

サンプルコードの全体像はこんな感じ

{
  "Comment": "A description of my state machine",
  "StartAt": "入力値のバリデーション",
  "States": {
    "入力値のバリデーション": {
      "Type": "Parallel",
      "Branches": [
        {
          "StartAt": "Mandatory1が設定されているかチェック",
          "States": {
            "Mandatory1が設定されているかチェック": {
              "Type": "Choice",
              "Choices": [
                {
                  "Variable": "$.input.mandatory1",
                  "IsPresent": false,
                  "Next": "Mandatory1が設定されていない場合"
                }
              ],
              "Default": "Mandatory1が設定されていた場合"
            },
            "Mandatory1が設定されていない場合": {
              "Type": "Pass",
              "End": true,
              "Parameters": {
                "mandatory1": {
                  "nestedField1": "defaultValue1",
                  "nestedField2": "defaultValue2"
                }
              },
              "Comment": " Mandatory1のデフォルト値をセット"
            },
            "Mandatory1が設定されていた場合": {
              "Type": "Pass",
              "End": true,
              "Parameters": {
                "mandatory1.$": "$.input.mandatory1"
              },
              "Comment": "入力のMandatory1をそのままセット"
            }
          }
        },
        {
          "StartAt": "Mandatory2が設定されているかチェック",
          "States": {
            "Mandatory2が設定されているかチェック": {
              "Type": "Choice",
              "Choices": [
                {
                  "Variable": "$.input.mandatory2",
                  "IsPresent": false,
                  "Next": "Mandatory2が設定されていない場合"
                }
              ],
              "Default": "Mandatory2が設定されていた場合"
            },
            "Mandatory2が設定されていない場合": {
              "Type": "Pass",
              "End": true,
              "Parameters": {
                "mandatory2": "defaultValue"
              },
              "Comment": "Mandatory2のデフォルト値をセット"
            },
            "Mandatory2が設定されていた場合": {
              "Type": "Pass",
              "End": true,
              "Parameters": {
                "mandatory2.$": "$.input.mandatory2"
              },
              "Comment": "入力のMandatory2をそのままセット"
            }
          }
        }
      ],
      "Next": "バリデーション結果を整形",
      "Parameters": {
        "input.$": "$"
      }
    },
    "バリデーション結果を整形": {
      "Type": "Pass",
      "Parameters": {
        "mandatory1.$": "$.[0].mandatory1",
        "mandatory2.$": "$.[1].mandatory2"
      },
      "Next": "何かしらの処理開始"
    },
    "何かしらの処理開始": {
      "Type": "Pass",
      "End": true
    }
  }
}

ビジュアル化した際の全体像はこちら

どこがダサいか

  • ビジュアル化した時のこのごちゃごちゃがワークフローのトップに置かれてるのがキモい(本来は「何かしらの処理開始」部分から始まってて欲しい)

  • 入力値が増えるたびに「Mandatoryほにゃららが設定されているかチェック」のChoice以下が増やさないといけない

  • 入力値が増えるたびに「バリデーション結果を整形」部分に以下のような形で項目を増やさないといけない

ただしきちんと動作はする

入力値に何も設定しなかった場合

上記のように何も入力値を設定しないで実行した場合は下記のようにデフォルト値が設定されます

入力値を一部設定した場合

上記のようにMandatory2にだけ値を設定して実行した場合、 Mandatory1にはデフォルト値が設定され、 Mandatory2には設定した値が反映されています

いいなと思ったら応援しよう!