#
# Licensed to the Apache Software Foundation (ASF) under one or more contributor
# license agreements.  See the NOTICE file distributed with this work for additional
# information regarding copyright ownership.  The ASF licenses this file to you
# under the Apache License, Version 2.0 (the # "License"); you may not use this
# file except in compliance with the License.  You may obtain a copy of the License
# at:
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software distributed
# under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
# CONDITIONS OF ANY KIND, either express or implied.  See the License for the
# specific language governing permissions and limitations under the License.
#
project:
    name: DemoConductor
    packages:
        conductorPackage1:
            actions:
                triple:
                    function: actions/triple.js
                increment:
                    function: actions/increment.js
                    runtime: nodejs:6
                tripleAndIncrement:
                    function: actions/tripleAndIncrement.js
                    conductor: true
        default:
            actions:
                triple:
                    code: |
                          function main({ value }) { return { value: value * 3 } }
                    runtime: nodejs:6
                increment:
                    code: |
                          function main({ value }) { return { value: value + 1 } }
                    runtime: nodejs:6
                tripleAndIncrement:
                    code: |
                          function main(params) {
                              let step = params.$step || 0
                              delete params.$step
                              switch (step) {
                                  case 0: return { action: 'triple', params, state: { $step: 1 } }
                                  case 1: return { action: 'increment', params, state: { $step: 2 } }
                                  case 2: return { params }
                              }
                          }
                    runtime: nodejs:6
                    conductor: true

