lib/micro/case.rb in u-case-1.1.0 vs lib/micro/case.rb in u-case-2.0.0.pre
- old
+ new
@@ -1,12 +1,93 @@
# frozen_string_literal: true
require 'micro/attributes'
+# frozen_string_literal: true
-require 'micro/case/version'
-require 'micro/case/error'
-require 'micro/case/result'
-require 'micro/case/base'
-require 'micro/case/safe'
-require 'micro/case/strict'
-require 'micro/case/flow/reducer'
-require 'micro/case/flow'
+module Micro
+ class Case
+ require 'micro/case/version'
+ require 'micro/case/result'
+ require 'micro/case/error'
+ require 'micro/case/safe'
+ require 'micro/case/strict'
+ require 'micro/case/flow/reducer'
+ require 'micro/case/flow'
+ require 'micro/case/safe/flow'
+
+ include Micro::Attributes.without(:strict_initialize)
+
+ def self.to_proc
+ Proc.new { |arg| call(arg) }
+ end
+
+ def self.>>(use_case)
+ Flow[self, use_case]
+ end
+
+ def self.&(use_case)
+ Safe::Flow[self, use_case]
+ end
+
+ def self.call(options = {})
+ new(options).call
+ end
+
+ def self.__new__(result, arg)
+ instance = new(arg)
+ instance.__set_result__(result)
+ instance
+ end
+
+ def self.__failure_type(arg, type)
+ return type if type != :error
+
+ case arg
+ when Exception then :exception
+ when Symbol then arg
+ else type
+ end
+ end
+
+ def call!
+ raise NotImplementedError
+ end
+
+ def call
+ __call
+ end
+
+ def __set_result__(result)
+ raise Error::InvalidResultInstance unless result.is_a?(Result)
+ raise Error::ResultIsAlreadyDefined if @__result
+
+ @__result = result
+ end
+
+ private
+
+ def __call
+ result = call!
+
+ return result if result.is_a?(Result)
+
+ raise Error::UnexpectedResult.new(self.class)
+ end
+
+ def __get_result__
+ @__result ||= Result.new
+ end
+
+ def Success(arg = :ok)
+ value, type = block_given? ? [yield, arg] : [arg, :ok]
+
+ __get_result__.__set__(true, value, type, nil)
+ end
+
+ def Failure(arg = :error)
+ value = block_given? ? yield : arg
+ type = self.class.__failure_type(value, block_given? ? arg : :error)
+
+ __get_result__.__set__(false, value, type, self)
+ end
+ end
+end