module Eco module API class UseCases class UseCase < BaseCase @types = BaseCase.types attr_reader :name, :type, :times_launched attr_reader :options def initialize(name, type:, root:, &block) raise InvalidType.new("Invalid type for '#{name}'.", type: type, types: self.class.types) unless self.class.valid_type?(type) self.root = root @callback = block @name = name @type = type @times_launched = 0 end def source_object return nil unless callback_from_loader? callback_self end def chainer # TODO: root is a Eco::API::UseCases that will not point to this new case. # => Moreover, the name and type will be the same as self Eco::API::UseCases::UseCaseChain.new(usecase: self, root: @root) end def root=(value) raise "Root should be a Eco::API::UseCases. Given: #{value.class}" if !value.is_a?(Eco::API::UseCases) @root = value end # Actual launch of the usecase # @param io [Eco::API::UseCases::BaseIO] an input/output helper with the necessary parameters. # @param kargs [Hash] hash with symbol keys. # @option kargs [Eco::API::Common::People::Entries, Eco::API::Organization::People] :input the input data of reference. # @option kargs [Eco::API::Organization::People] :people object. # @option kargs [Eco::API:Session] :session # @option kargs [Hash] :options hash with symbol keys (i.e. behaviour modifiers, cli trackers, filters, etc.) def launch(io: nil, **kargs) params = io&.params(keyed: true, all: true) || {} kargs = params.merge(kargs).merge(usecase: self) UseCaseIO.new(**kargs).tap do |uio| @options = uio.options uio.session.logger.debug("#{self.class}: going to process '#{name}'") set_session_n_options(session: uio.session, options: uio.options) if callback_from_loader? uio.output = @callback.call(*uio.params) @times_launched += 1 end end protected def callback @callback end def callback_self eval("self", @callback.binding) end def callback_from_loader? callback_self.is_a?(Eco::API::Common::Loaders::Base) end # Set the instance variables `@session` and `@options` # in the use case definition # @note this only works when the use case was defined # via an children class of `Eco::API::Common::Loaders::Base` def set_session_n_options(session:, options: @options) return false unless callback_from_loader? use_case_self = self callback_self.instance_eval do next unless self.is_a?(Eco::API::Common::Loaders::CaseBase) # `self` is the use case itself (when used the Loader) @session = session @options = options @usecase = use_case_self end true end end end end end