lib/bcdd/result/context/success.rb in bcdd-result-0.12.0 vs lib/bcdd/result/context/success.rb in bcdd-result-0.13.0
- old
+ new
@@ -1,19 +1,37 @@
# 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!
- exposed_value = acc.merge(value).slice(*keys)
+ acc_values = acc.merge(value)
- self.class.new(type: type, value: exposed_value, source: source, terminal: terminal)
+ 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