lib/micro/case.rb in u-case-4.0.0 vs lib/micro/case.rb in u-case-4.1.0

- old
+ new

@@ -5,23 +5,28 @@ require 'micro/case/version' module Micro class Case + require 'micro/cases/utils' require 'micro/case/utils' require 'micro/case/error' require 'micro/case/result' require 'micro/case/safe' require 'micro/case/strict' require 'micro/case/config' require 'micro/cases' - include Micro::Attributes.with(:initialize, :diff) + include Micro::Attributes - def self.call(options = Kind::Empty::HASH) - new(options).__call__ + def self.call(input = Kind::Empty::HASH) + result = __new__(Result.new, input).__call__ + + return result unless block_given? + + yield Result::Wrapper.new(result) end INVALID_INVOCATION_OF_THE_THEN_METHOD = Error::InvalidInvocationOfTheThenMethod.new("#{self.name}.") @@ -45,11 +50,11 @@ def self.to_proc Proc.new { |arg| call(arg) } end def self.flow(*args) - @__flow_use_cases = args + @__flow_use_cases = Cases::Utils.map_use_cases(args) end class << self alias __call__ call @@ -79,10 +84,12 @@ input = result.__set_accessible_attributes__(arg) new(input).__set_result__(result) end + private_class_method :new + def self.__flow_builder__ Cases::Flow end def self.__flow_get__ @@ -120,20 +127,28 @@ def self.__flow_set__! __flow_set(__flow_use_cases_get) if !__flow_get__ && __flow_use_cases end + def self.inspect + if __flow_use_cases + '<%s (%s) use_cases=%s>' % [self, __flow_builder__, @__flow_use_cases] + else + '<%s (%s) attributes=%s>' % [self, self.superclass, attributes] + end + end + def initialize(input) __setup_use_case(input) end def call! raise NotImplementedError end def __call__ - call + __call_the_use_case_or_its_flow end def __set_result__(result) raise Error::InvalidResultInstance unless result.is_a?(Result) raise Error::ResultIsAlreadyDefined if defined?(@__result) @@ -143,16 +158,25 @@ self end private + def call(use_case, defaults = Kind::Empty::HASH) + raise Error::InvalidUseCase unless ::Micro.case_or_flow?(use_case) + + input = + defaults.empty? ? attributes : attributes.merge(Utils::Hashes.stringify_keys(defaults)) + + use_case.__new__(@__result, input).__call__ + end + def apply(name) method(name) end - def call - return __call_use_case_flow if __call_use_case_flow? + def __call_the_use_case_or_its_flow + return __call_the_use_case_flow if __call_the_use_case_flow? __call_use_case end def __setup_use_case(input) @@ -169,15 +193,15 @@ return result if result.is_a?(Result) raise Error::UnexpectedResult.new("#{self.class.name}#call!") end - def __call_use_case_flow? + def __call_the_use_case_flow? self.class.__flow_get__ end - def __call_use_case_flow + def __call_the_use_case_flow self.class.__flow_get__.call(@__input) end def Success(type = :ok, result: nil) value = result || type @@ -199,20 +223,20 @@ type = MapFailureType.call(value, type) __get_result(false, value, type) end - def __result - @__result ||= Result.new - end - def __get_result(is_success, value, type) - __result.__set__(is_success, value, type, self) + @__result.__set__(is_success, value, type, self) end private_constant :MapFailureType, :INVALID_INVOCATION_OF_THE_THEN_METHOD end + def self.case?(arg) + arg.is_a?(Class) && arg < Case + end + def self.case_or_flow?(arg) - (arg.is_a?(Class) && arg < Case) || arg.is_a?(Cases::Flow) + case?(arg) || arg.is_a?(Cases::Flow) end end