Class: Result

Inherits:
Object
  • Object
show all
Defined in:
lib/wolf_core/utils/result.rb

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(success:, data: nil, error: nil) ⇒ Result

Returns a new instance of Result.



6
7
8
9
10
# File 'lib/wolf_core/utils/result.rb', line 6

def initialize(success:, data: nil, error: nil)
  @success = success
  @data = data
  @error = error
end

Instance Attribute Details

#dataObject

Returns the value of attribute data.



4
5
6
# File 'lib/wolf_core/utils/result.rb', line 4

def data
  @data
end

#errorObject

Returns the value of attribute error.



4
5
6
# File 'lib/wolf_core/utils/result.rb', line 4

def error
  @error
end

Class Method Details

.failure(error: {}) ⇒ Object



16
17
18
# File 'lib/wolf_core/utils/result.rb', line 16

def self.failure(error: {})
  Result.new(success: false, error: OpenStruct.new(error))
end

.success(data: {}) ⇒ Object



12
13
14
# File 'lib/wolf_core/utils/result.rb', line 12

def self.success(data: {})
  Result.new(success: true, data: OpenStruct.new(data))
end

.tryObject



20
21
22
23
24
25
26
27
28
# File 'lib/wolf_core/utils/result.rb', line 20

def self.try
  try_result = yield
  unless try_result.is_a?(Result)
    raise StandardError, "Try result must be a Result object, got: #{try_result.class}"
  end
  try_result
rescue StandardError => e
  Result.failure(error: { message: e.message, error_class: e.class, backtrace: e.backtrace })
end

Instance Method Details

#data_or_raise_errorObject



81
82
83
# File 'lib/wolf_core/utils/result.rb', line 81

def data_or_raise_error
  raise_error.data
end

#failure?Boolean

Returns:

  • (Boolean)


34
35
36
# File 'lib/wolf_core/utils/result.rb', line 34

def failure?
  !@success
end

#fold(success: nil, failure: nil) ⇒ Object



56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
# File 'lib/wolf_core/utils/result.rb', line 56

def fold(success: nil, failure: nil)
  fold_result = if success?
    if success.respond_to?(:call)
      success.call(@data)
    else
      if block_given?
        yield(@data)
      else
        self
      end
    end
  else
    if failure.respond_to?(:call)
      failure.call(@error)
    else
      self
    end
  end

  unless fold_result.is_a?(Result)
    raise StandardError, "Fold result must be a Result object, got: #{fold_result.class}"
  end
  fold_result
end

#raise_errorObject



85
86
87
88
89
90
91
92
93
94
95
96
# File 'lib/wolf_core/utils/result.rb', line 85

def raise_error
  return self if success?

  err_class = error.error_class || StandardError
  e = begin
    err_class.new(error.message)
  rescue
    StandardError.new(error.message)
  end
  e.set_backtrace(error.backtrace) if error.backtrace
  raise e
end

#slice(*keys) ⇒ Object



46
47
48
49
50
51
52
53
54
# File 'lib/wolf_core/utils/result.rb', line 46

def slice(*keys)
  if success?
    sliced_data = @data.to_h.slice(*keys)
    Result.success(data: sliced_data)
  else
    sliced_error = @error.to_h.slice(*keys)
    Result.failure(error: sliced_error)
  end
end

#success?Boolean

Returns:

  • (Boolean)


30
31
32
# File 'lib/wolf_core/utils/result.rb', line 30

def success?
  @success
end

#to_hObject



38
39
40
41
42
43
44
# File 'lib/wolf_core/utils/result.rb', line 38

def to_h
  {
    success: @success,
    data: @data,
    error: @error,
  }
end