lib/eco/api/usecases/use_case_chain.rb in eco-helpers-0.9.2 vs lib/eco/api/usecases/use_case_chain.rb in eco-helpers-0.9.3

- old
+ new

@@ -1,12 +1,14 @@ module Eco module API - module UseCases + class UseCases class UseCaseChain < UseCase MAX_CHAINS = 70 @@num_chains = 0 + @types = [:import, :filter, :transform, :sync, :export] + def initialize(name = nil, type: nil, root:, usecase: nil, &block) if usecase raise "Expected Eco::API::UseCases::UseCase. Given #{usecase.class}" if !usecase.is_a?(Eco::API::UseCases::UseCase) type = usecase.type name = usecase.name @@ -17,11 +19,11 @@ @chains = [] @resolved_chains = nil end def root=(value) - raise "You cannot change root UseGroup once the chains have been resolved" if @resolved_chains + raise "You cannot change root Eco::API::UseCases once the chains have been resolved" if @resolved_chains super(value) end def use(preserve_chains: false, recursive: false) UseCase.new(@name, type: @type, root: @root, &@case).tap do |newcase| @@ -41,13 +43,19 @@ end end end end - def launch(input: nil, people: nil, session:, options: {}) - data_model = super(input: input, people: people, session: session, options: options) - launch_chain(data_model) + # @see Eco::API::UseCases::UseCase#launch + def launch(io: nil, **kargs) + super(io: io, **kargs).tap do |uio| + next if resolved_chains.empty? + + resolved_chains.each do |usecase| + uio = usecase.launch(io: uio.chain(usecase: usecase)) + end + end end def chain(usecase = nil) @@num_chains += 1 raise "Reached maximum number of chained use cases (#{MAX_CHAINS}). Looks like a recursive cyclic chain 'use'" if @@num_chains >= MAX_CHAINS @@ -65,35 +73,17 @@ usecase.chain(self) end def resolved_chains(use_group = nil) return @resolved_chains if @resolved_chains - raise "Only UseGroup object can resolve chains. Given: #{use_group} " if use_group && !use_group.is_a?(UseGroup) + raise "Only Eco::API::UseCases object can contain resolved chains. Given: #{use_group.class} " if use_group && !use_group.is_a?(Eco::API::UseCases) use_group = use_group || @root @resolved_chains = @chains.map do |usecase| usecase = usecase.call(use_group) if usecase.respond_to?(:call) raise "A UseCase can only be chained with another UseCase" if usecase && !usecase.is_a?(UseCase) usecase.resolved_chains(use_group) if usecase.respond_to?(:resolved_chains) usecase - end - end - - private - - def launch_chain(data_model) - return data_model if resolved_chains.empty? - - data_model.tap do |dm| - dm[self][:chains] ||= {} - - resolved_chains.each do |usecase| - # chained cases use same params as parent case (out of simplicity) - data_chain = dm[self][:io].chain(usecase: usecase) - keyed_data = data_chain.params(keyed: true) - keyed_data.delete(:usecase) - dm[self][:chains].merge(usecase.launch(keyed_data)) - end end end end