Hi! I started using dry-transaction
gem and noticed a small problem. What I’m trying to do is to replace the huge service classes with dry
abstractions. I started with Dry::Transaction
by adding steps.
Currently I have a file with 10 steps, and the third one is the around
step. And I want the ability to pattern match steps below the around
one. I started with the straightforward implementation:
transaction = MyTransaction.new
transaction.(input) do |m|
m.success { |v| v }
m.failure :some_step_below_the_around do |v|
puts "Failed in some step"
end
m.failure :around_step do |v|
puts "Failed in around step"
end
end
I noticed that the failure
match is called for failure :around_step
for all steps above the around
one.
I found a workaround to have the ability to pattern match on specific step inside the around:
results = []
transaction.(input) do |m|
m.success {}
m.failure :around do |value|
::Dry::Transaction::ResultMatcher.(Dry::Monads::Failure(value)) do |n|
n.success {}
n.failure :some_step_below_the_around do |v|
results << "Failed in some step"
end
end
end
end
results #["Failed in some step"]
But I thought that this is not good enough because api of the gem might change and wanted to share.
I’ve added some specs about this problem here.