Sha256: c00244ff929783eff09aed1a3954af2b7480b685f1fbe93e10250732c2151f91

Contents?: true

Size: 1.95 KB

Versions: 13

Compression:

Stored size: 1.95 KB

Contents

# frozen_string_literal: true

module Floe
  class Workflow
    class PayloadTemplate
      def initialize(payload)
        @payload_template = parse_payload(payload)
      end

      def value(context, inputs = {})
        interpolate_value(payload_template, context, inputs)
      end

      private

      attr_reader :payload_template

      def parse_payload(value)
        case value
        when Array  then parse_payload_array(value)
        when Hash   then parse_payload_hash(value)
        when String then parse_payload_string(value)
        else
          value
        end
      end

      def parse_payload_array(value)
        value.map { |val| parse_payload(val) }
      end

      def parse_payload_hash(value)
        value.to_h do |key, val|
          if key.end_with?(".$")
            check_key_conflicts(key, value)

            [key, parse_payload(val)]
          else
            [key, val]
          end
        end
      end

      def parse_payload_string(value)
        value.start_with?("$") ? Path.new(value) : value
      end

      def interpolate_value(value, context, inputs)
        case value
        when Array then interpolate_value_array(value, context, inputs)
        when Hash  then interpolate_value_hash(value, context, inputs)
        when Path  then value.value(context, inputs)
        else
          value
        end
      end

      def interpolate_value_array(value, context, inputs)
        value.map { |val| interpolate_value(val, context, inputs) }
      end

      def interpolate_value_hash(value, context, inputs)
        value.to_h do |key, val|
          if key.end_with?(".$")
            [key.chomp(".$"), interpolate_value(val, context, inputs)]
          else
            [key, val]
          end
        end
      end

      def check_key_conflicts(key, value)
        if value.key?(key.chomp(".$"))
          raise Floe::InvalidWorkflowError, "both #{key} and #{key.chomp(".$")} present"
        end
      end
    end
  end
end

Version data entries

13 entries across 13 versions & 1 rubygems

Version Path
floe-0.11.3 lib/floe/workflow/payload_template.rb
floe-0.11.0 lib/floe/workflow/payload_template.rb
floe-0.10.0 lib/floe/workflow/payload_template.rb
floe-0.9.0 lib/floe/workflow/payload_template.rb
floe-0.7.1 lib/floe/workflow/payload_template.rb
floe-0.8.0 lib/floe/workflow/payload_template.rb
floe-0.7.0 lib/floe/workflow/payload_template.rb
floe-0.6.1 lib/floe/workflow/payload_template.rb
floe-0.6.0 lib/floe/workflow/payload_template.rb
floe-0.5.0 lib/floe/workflow/payload_template.rb
floe-0.4.1 lib/floe/workflow/payload_template.rb
floe-0.4.0 lib/floe/workflow/payload_template.rb
floe-0.3.1 lib/floe/workflow/payload_template.rb