lib/dirty_pipeline/transition.rb in dirty_pipeline-0.8.3 vs lib/dirty_pipeline/transition.rb in dirty_pipeline-0.9.0
- old
+ new
@@ -1,41 +1,62 @@
module DirtyPipeline
+ class Rollback < StandardError; end
+
class Transition
def Failure(error)
railway&.switch_to(:undo)
throw :fail_transition, error
end
def Success(changes = nil)
case railway&.active
+ when "finalize_undo"
+ railway&.switch_to(:undo)
+ when "undo"
+ railway&.switch_to(:finalize_undo) if respond_to?(:finalize_undo)
when "call"
railway&.switch_to(:finalize) if respond_to?(:finalize)
when "finalize"
railway&.switch_to(:call)
end
throw :success, changes.to_h
end
+ def self.finalize_undo(*args, **kwargs)
+ event, pipeline, *args = args
+ instance = new(event, pipeline.railway, *args, **kwargs)
+ return unless instance.respond_to?(:finalize_undo)
+ instance.finalize_undo(pipeline.subject)
+ end
+
def self.finalize(*args, **kwargs)
event, pipeline, *args = args
instance = new(event, pipeline.railway, *args, **kwargs)
return unless instance.respond_to?(:finalize)
instance.finalize(pipeline.subject)
end
def self.undo(*args, **kwargs)
event, pipeline, *args = args
instance = new(event, pipeline.railway, *args, **kwargs)
+ pipeline&.railway&.send(:[], :finalize_undo)&.send(:<<, event)
return unless instance.respond_to?(:undo)
instance.undo(pipeline.subject)
end
def self.call(*args, **kwargs)
event, pipeline, *args = args
instance = new(event, pipeline.railway, *args, **kwargs)
- pipeline&.railway&.send(:[], :undo)&.send(:<<, event)
pipeline&.railway&.send(:[], :finalize)&.send(:<<, event)
+ prepare_undo(pipeline, event)
instance.call(pipeline.subject)
+ end
+
+ def self.prepare_undo(pipeline, event)
+ anti_event = event.dup
+ anti_event.source, anti_event.destination =
+ event.destination, event.source
+ pipeline&.railway&.send(:[], :undo)&.send(:unshift, anti_event)
end
attr_reader :event, :railway
def initialize(event, railway, *, **)
@event = event