---
Comment: A distributed saga example.
StartAt: BookTrip
States:
  BookTrip:
    Type: Parallel
    Next: "Validate HTTP Status Code"
    Branches:
    - StartAt: BookHotel
      States:
        BookHotel:
          Type: Task
          Resource: "${BookHotelFunctionArn}"
          ResultPath: "$.Result"
          Retry:
            - ErrorEquals:
                - States.TaskFailed
              IntervalSeconds: 2
              MaxAttempts: 3
              BackoffRate: 1
          End: true
    - StartAt: BookFlight
      States:
        BookFlight:
          Type: Task
          Resource: "${BookFlightFunctionArn}"
          ResultPath: "$.Result"
          Retry:
            - ErrorEquals:
                - States.TaskFailed
              IntervalSeconds: 2
              MaxAttempts: 3
              BackoffRate: 1
          End: true
    - StartAt: BookCar
      States:
        BookCar:
          Type: Task
          Resource: "${BookCarFunctionArn}"
          ResultPath: "$.Result"
          Retry:
            - ErrorEquals:
                - States.TaskFailed
              IntervalSeconds: 2
              MaxAttempts: 3
              BackoffRate: 1
          End: true
    Catch:
    - ErrorEquals:
      - States.ALL
      ResultPath: "$.BookTripError"
      Next: "Trip Booking Failed"
  "Validate HTTP Status Code":
    Type: Choice
    Default: "Trip Booking Successful" 
    Choices:
      - Or:
        - Variable: "$[0].Result.statusCode"
          NumericGreaterThanEquals: 300
        - Variable: "$[1].Result.statusCode"
          NumericGreaterThanEquals: 300
        - Variable: "$[2].Result.statusCode"
          NumericGreaterThanEquals: 300
        Next: "Trip Booking Failed"
  "Trip Booking Failed":
    Type: Pass
    Next: CancelTrip
  CancelTrip:
    Type: Parallel
    Next: "Trip Booking Cancelled"
    Branches:
    - StartAt: CancelHotel
      States:
        CancelHotel:
          Type: Task
          Resource: "${CancelHotelFunctionArn}"
          Retry:
            - ErrorEquals:
                - States.TaskFailed
              IntervalSeconds: 2
              MaxAttempts: 3
              BackoffRate: 1
          End: true
    - StartAt: CancelFlight
      States:
        CancelFlight:
          Type: Task
          Resource: "${CancelFlightFunctionArn}"
          Retry:
            - ErrorEquals:
                - States.TaskFailed
              IntervalSeconds: 2
              MaxAttempts: 3
              BackoffRate: 1
          End: true
    - StartAt: CancelCar
      States:
        CancelCar:
          Type: Task
          Resource: "${CancelCarFunctionArn}"
          Retry:
            - ErrorEquals:
                - States.TaskFailed
              IntervalSeconds: 2
              MaxAttempts: 3
              BackoffRate: 1
          End: true
  "Trip Booking Successful":
    Type: Succeed
  "Trip Booking Cancelled":
    Type: Fail
    Cause: Trip cancelled due to error.
    Error: TripCancelledError