CHANGELOG.md in bcdd-result-0.4.0 vs CHANGELOG.md in bcdd-result-0.5.0

- old
+ new

@@ -1,6 +1,80 @@ ## [Unreleased] +## [0.5.0] - 2023-10-09 + +- Add `BCDD::Result::Expectations` to define contracts for your results. There are two ways to use it: the standalone (`BCDD::Result::Expectations.new`) and the mixin (`BCDD::Result::Expectations.mixin`) mode. + +The main difference is that the mixin mode will use the target object (who receives the include/extend) as the result's subject (like the `BCDD::Result::Mixin` does), while the standalone mode won't. + +**Standalone mode:** + +```ruby +module Divide + Expected = BCDD::Result::Expectations.new( + success: { + numbers: ->(value) { value.is_a?(Array) && value.size == 2 && value.all?(Numeric) }, + division_completed: Numeric + }, + failure: { + invalid_arg: String, + division_by_zero: String + } + ) + + def self.call(arg1, arg2) + arg1.is_a?(Numeric) or return Expected::Failure(:invalid_arg, 'arg1 must be numeric') + arg2.is_a?(Numeric) or return Expected::Failure(:invalid_arg, 'arg2 must be numeric') + + arg2.zero? and return Expected::Failure(:division_by_zero, 'arg2 must not be zero') + + Expected::Success(:division_completed, arg1 / arg2) + end +end +``` + +**Mixin mode:** + +```ruby +class Divide + include BCDD::Result::Expectations.mixin( + success: { + numbers: ->(value) { value.is_a?(Array) && value.size == 2 && value.all?(Numeric) }, + division_completed: Numeric + }, + failure: { + invalid_arg: String, + division_by_zero: String + } + ) + + def call(arg1, arg2) + validate_numbers(arg1, arg2) + .and_then(:validate_non_zero) + .and_then(:divide) + end + + private + + def validate_numbers(arg1, arg2) + arg1.is_a?(Numeric) or return Failure(:invalid_arg, 'arg1 must be numeric') + arg2.is_a?(Numeric) or return Failure(:invalid_arg, 'arg2 must be numeric') + + Success(:numbers, [arg1, arg2]) + end + + def validate_non_zero(numbers) + return Success(:numbers, numbers) unless numbers.last.zero? + + Failure(:division_by_zero, 'arg2 must not be zero') + end + + def divide((number1, number2)) + Success(:division_completed, number1 / number2) + end +end +``` + ## [0.4.0] - 2023-09-28 ### Added - Add `require 'result'` to define `Result` as an alias for `BCDD::Result`.