Module: Teckel::Operation::Results

Defined in:
lib/teckel/operation/results.rb

Overview

Works just like Teckel::Operation, but wraps output and error into a Teckel::Result.

If a Teckel::Result is given as input, it will get unwrapped, so that the original Result#value gets passed to your Operation code.

Examples:


class CreateUser
  include Teckel::Operation::Results

  input  Types::Hash.schema(name: Types::String, age: Types::Coercible::Integer)
  output Types.Instance(User)
  error  Types::Hash.schema(message: Types::String, errors: Types::Array.of(Types::Hash))

  # @param [Hash<name: String, age: Integer>]
  # @return [User,Hash<message: String, errors: [Hash]>]
  def call(input)
    user = User.new(name: input[:name], age: input[:age])
    if user.save
      success!(user) # exits early with success, prevents any further execution
    else
      fail!(message: "Could not save User", errors: user.errors)
    end
  end
end

# A success call:
CreateUser.call(name: "Bob", age: 23).is_a?(Teckel::Result) #=> true
CreateUser.call(name: "Bob", age: 23).success.is_a?(User) #=> true

# A failure call:
CreateUser.call(name: "Bob", age: 10).is_a?(Teckel::Result) #=> true
CreateUser.call(name: "Bob", age: 10).failure.is_a?(Hash) #=> true

# Unwrapping success input:
CreateUser.call(Teckel::Result.new({name: "Bob", age: 23}, true)).success.is_a?(User) #=> true

# Unwrapping failure input:
CreateUser.call(Teckel::Result.new({name: "Bob", age: 23}, false)).success.is_a?(User) #=> true

Defined Under Namespace

Classes: Runner

Class Method Summary collapse

Class Method Details

.included(receiver) ⇒ Object



66
67
68
69
# File 'lib/teckel/operation/results.rb', line 66

def self.included(receiver)
  receiver.send :include, Teckel::Operation unless Teckel::Operation >= receiver
  receiver.send :runner, Runner
end