Sha256: 7d730450a8b48f25e59998e70b38b4708c606527945c8c46fbddc508ad643203

Contents?: true

Size: 1.04 KB

Versions: 1

Compression:

Stored size: 1.04 KB

Contents

# frozen_string_literal: true

class BCDD::Result
  class Context::Error < BCDD::Result::Error
    InvalidExposure = ::Class.new(self)
  end

  class Context::Success < Context
    include ::BCDD::Result::Success::Methods

    FetchValues = ->(acc_values, keys) do
      fetched_values = acc_values.fetch_values(*keys)

      keys.zip(fetched_values).to_h
    rescue ::KeyError => e
      message = "#{e.message}. Available to expose: #{acc_values.keys.map(&:inspect).join(', ')}"

      raise Context::Error::InvalidExposure, message
    end

    def and_expose(type, keys, terminal: true)
      unless keys.is_a?(::Array) && !keys.empty? && keys.all?(::Symbol)
        raise ::ArgumentError, 'keys must be an Array of Symbols'
      end

      Transitions.tracking.reset_and_then!

      acc_values = acc.merge(value)

      value_to_expose = FetchValues.call(acc_values, keys)

      expectations = type_checker.expectations

      self.class.new(type: type, value: value_to_expose, source: source, terminal: terminal, expectations: expectations)
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
bcdd-result-0.13.0 lib/bcdd/result/context/success.rb