Class: Railsmith::Result

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

Overview

An immutable success/failure wrapper with a stable serialization contract.

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(success:, value:, error:, meta:) ⇒ Result

Returns a new instance of Result.



24
25
26
27
28
29
30
# File 'lib/railsmith/result.rb', line 24

def initialize(success:, value:, error:, meta:)
  @success = success ? true : false
  @value = value
  @error = error
  @meta = meta || {}
  freeze
end

Instance Attribute Details

#errorObject (readonly)

Returns the value of attribute error.



40
41
42
# File 'lib/railsmith/result.rb', line 40

def error
  @error
end

#metaObject (readonly)

Returns the value of attribute meta.



40
41
42
# File 'lib/railsmith/result.rb', line 40

def meta
  @meta
end

#valueObject (readonly)

Returns the value of attribute value.



40
41
42
# File 'lib/railsmith/result.rb', line 40

def value
  @value
end

Class Method Details

.failure(code: nil, message: nil, details: nil, error: nil, meta: nil) ⇒ Object



10
11
12
13
14
15
16
17
18
19
20
# File 'lib/railsmith/result.rb', line 10

def self.failure(code: nil, message: nil, details: nil, error: nil, meta: nil)
  normalized_error =
    error ||
    Errors::ErrorPayload.new(
      code: code || :unexpected,
      message: message || "Unexpected error",
      details:
    )

  new(success: false, value: nil, error: normalized_error, meta: meta || {})
end

.success(value: nil, meta: nil) ⇒ Object



6
7
8
# File 'lib/railsmith/result.rb', line 6

def self.success(value: nil, meta: nil)
  new(success: true, value:, error: nil, meta: meta || {})
end

Instance Method Details

#and_thenObject



48
49
50
51
52
53
# File 'lib/railsmith/result.rb', line 48

def and_then
  return self if failure?

  chained = yield(@value)
  merge_meta(chained)
end

#as_jsonObject



80
81
82
# File 'lib/railsmith/result.rb', line 80

def as_json(*)
  to_h
end

#codeObject



42
43
44
45
46
# File 'lib/railsmith/result.rb', line 42

def code
  return nil if error.nil?

  error.code
end

#failure?Boolean

Returns:

  • (Boolean)


36
37
38
# File 'lib/railsmith/result.rb', line 36

def failure?
  !success?
end

#on_failure {|@error| ... } ⇒ Object

Yields:



67
68
69
70
# File 'lib/railsmith/result.rb', line 67

def on_failure
  yield(@error) if failure?
  self
end

#on_success {|@value| ... } ⇒ Object

Yields:



62
63
64
65
# File 'lib/railsmith/result.rb', line 62

def on_success
  yield(@value) if success?
  self
end

#or_elseObject



55
56
57
58
59
60
# File 'lib/railsmith/result.rb', line 55

def or_else
  return self if success?

  chained = yield(@error)
  merge_meta(chained)
end

#success?Boolean

Returns:

  • (Boolean)


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

def success?
  @success
end

#to_hObject



72
73
74
75
76
77
78
# File 'lib/railsmith/result.rb', line 72

def to_h
  if success?
    { success: true, value:, meta: }
  else
    { success: false, error: error.to_h, meta: }
  end
end