Module: Operatic

Defined in:
lib/operatic.rb,
lib/operatic/data.rb,
lib/operatic/errors.rb,
lib/operatic/result.rb,
lib/operatic/version.rb

Defined Under Namespace

Modules: ClassMethods Classes: Data, Failure, Result, Success

Constant Summary collapse

OperaticError =
Class.new(StandardError)
FailureError =
Class.new(OperaticError)
VERSION =
'0.7.0'

Instance Attribute Summary collapse

Instance Method Summary collapse

Instance Attribute Details

#resultSuccess, Failure (readonly)

Returns:



74
75
76
# File 'lib/operatic.rb', line 74

def result
  @result
end

Instance Method Details

#callObject

Override this method with your implementation. Use #success!/#failure! to define the status of the result Success/Failure and attach data.

Examples:

class SayHello
  include Operatic

  def call
    return failure! unless @name
    success!(message: "Hello #{@name}")
  end
end

result = SayHello.call(name: 'Dave')
result.class     # => Operatic::Success
result.failure?  # => false
result.success?  # => true
result[:message] # => "Hello Dave"
result.to_h      # => {:message=>"Hello Dave"}

result = SayHello.call
result.class     # => Operatic::Failure
result.failure?  # => true
result.success?  # => false
result.to_h      # => {}


108
109
# File 'lib/operatic.rb', line 108

def call
end

#dataData

Any data to be communicated via the operation’s result should be added to this Data object.

Note: This will be frozen when returned from an operation.

Examples:

class SayHello
  include Operatic

  def call
    data[:message] = "Hello #{@name}"
  end
end

result = SayHello.call(name: 'Dave')
result.data.to_h     # => {:message=>"Dave"}
result.data.frozen?  # => true

Returns:



130
131
132
# File 'lib/operatic.rb', line 130

def data
  @data ||= self.class.data_class.new
end

#failure!(**kwargs) ⇒ Object

Mark the operation as a failure and prevent further modification to the operation, its result, and its data.

Parameters:

  • kwargs (Hash<Symbol, anything>)

Raises:

  • (FrozenError)

    if called more than once



140
141
142
143
# File 'lib/operatic.rb', line 140

def failure!(**kwargs)
  @result = Failure.new(data.merge(kwargs))
  freeze
end

#freezeself

Returns:

  • (self)


146
147
148
149
# File 'lib/operatic.rb', line 146

def freeze
  @result.freeze
  super
end

#initialize(**attrs) ⇒ Object

Parameters:

  • attrs (Hash<Symbol, anything>)


77
78
79
80
81
# File 'lib/operatic.rb', line 77

def initialize(**attrs)
  attrs.each do |key, value|
    instance_variable_set("@#{key}", value)
  end
end

#success!(**kwargs) ⇒ Object

Mark the operation as a success and prevent further modification to the operation, its result, and its data.

Parameters:

  • kwargs (Hash<Symbol, anything>)

Raises:

  • (FrozenError)

    if called more than once



157
158
159
160
# File 'lib/operatic.rb', line 157

def success!(**kwargs)
  @result = Success.new(data.merge(kwargs))
  freeze
end