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.



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

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

Instance Attribute Details

#dataObject

Returns the value of attribute data.



2
3
4
# File 'lib/wolf_core/utils/result.rb', line 2

def data
  @data
end

#errorObject

Returns the value of attribute error.



2
3
4
# File 'lib/wolf_core/utils/result.rb', line 2

def error
  @error
end

Class Method Details

.failure(error: {}) ⇒ Object



14
15
16
# File 'lib/wolf_core/utils/result.rb', line 14

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

.success(data: {}) ⇒ Object



10
11
12
# File 'lib/wolf_core/utils/result.rb', line 10

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

.tryObject



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

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



79
80
81
# File 'lib/wolf_core/utils/result.rb', line 79

def data_or_raise_error
  raise_error.data
end

#failure?Boolean

Returns:

  • (Boolean)


32
33
34
# File 'lib/wolf_core/utils/result.rb', line 32

def failure?
  !@success
end

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



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

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



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

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



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

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)


28
29
30
# File 'lib/wolf_core/utils/result.rb', line 28

def success?
  @success
end

#to_hObject



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

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