Class: Fractor::WorkResult

Inherits:
Object
  • Object
show all
Defined in:
lib/fractor/work_result.rb

Overview

Represents the result of processing a Work item. Can hold either a successful result or an error with rich metadata.

Constant Summary collapse

SEVERITY_CRITICAL =

Error severity levels

:critical
SEVERITY_ERROR =

System-breaking errors

:error
SEVERITY_WARNING =

Standard errors

:warning
SEVERITY_INFO =

Non-fatal issues

:info
CATEGORY_VALIDATION =

Error categories

:validation
CATEGORY_TIMEOUT =

Input validation errors

:timeout
CATEGORY_NETWORK =

Timeout errors

:network
CATEGORY_RESOURCE =

Network-related errors

:resource
CATEGORY_BUSINESS =

Resource exhaustion

:business
CATEGORY_SYSTEM =

Business logic errors

:system
CATEGORY_UNKNOWN =

System errors

:unknown

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(result: nil, error: nil, work: nil, error_code: nil, error_context: nil, error_category: nil, error_severity: nil, suggestion: nil, stack_trace: nil) ⇒ WorkResult

Returns a new instance of WorkResult.



25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
# File 'lib/fractor/work_result.rb', line 25

def initialize(
  result: nil,
  error: nil,
  work: nil,
  error_code: nil,
  error_context: nil,
  error_category: nil,
  error_severity: nil,
  suggestion: nil,
  stack_trace: nil
)
  @result = result
  @error = error
  @work = work
  @error_code = error_code
  @error_context = error_context || {}
  @error_category = error_category || infer_category(error)
  @error_severity = error_severity || infer_severity(error)
  @suggestion = suggestion || infer_suggestion(error)
  @stack_trace = stack_trace || capture_stack_trace(error)
end

Instance Attribute Details

#errorObject (readonly)

Unknown/uncategorized



22
23
24
# File 'lib/fractor/work_result.rb', line 22

def error
  @error
end

#error_categoryObject (readonly)

Unknown/uncategorized



22
23
24
# File 'lib/fractor/work_result.rb', line 22

def error_category
  @error_category
end

#error_codeObject (readonly)

Unknown/uncategorized



22
23
24
# File 'lib/fractor/work_result.rb', line 22

def error_code
  @error_code
end

#error_contextObject (readonly)

Unknown/uncategorized



22
23
24
# File 'lib/fractor/work_result.rb', line 22

def error_context
  @error_context
end

#error_severityObject (readonly)

Unknown/uncategorized



22
23
24
# File 'lib/fractor/work_result.rb', line 22

def error_severity
  @error_severity
end

#resultObject (readonly)

Unknown/uncategorized



22
23
24
# File 'lib/fractor/work_result.rb', line 22

def result
  @result
end

#stack_traceObject (readonly)

Unknown/uncategorized



22
23
24
# File 'lib/fractor/work_result.rb', line 22

def stack_trace
  @stack_trace
end

#suggestionObject (readonly)

Unknown/uncategorized



22
23
24
# File 'lib/fractor/work_result.rb', line 22

def suggestion
  @suggestion
end

#workObject (readonly)

Unknown/uncategorized



22
23
24
# File 'lib/fractor/work_result.rb', line 22

def work
  @work
end

Instance Method Details

#critical?Boolean

Check if error is critical

Returns:

  • (Boolean)


56
57
58
# File 'lib/fractor/work_result.rb', line 56

def critical?
  @error_severity == SEVERITY_CRITICAL
end

#error_infoObject

Get full error information as hash



73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
# File 'lib/fractor/work_result.rb', line 73

def error_info
  return nil if success?

  {
    error: @error,
    error_class: @error&.class&.name,
    error_message: @error&.message,
    error_code: @error_code,
    error_category: @error_category,
    error_severity: @error_severity,
    error_context: @error_context,
    suggestion: @suggestion,
    stack_trace: @stack_trace,
  }
end

#failure?Boolean

Returns:

  • (Boolean)


51
52
53
# File 'lib/fractor/work_result.rb', line 51

def failure?
  !success?
end

#inspectObject



97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
# File 'lib/fractor/work_result.rb', line 97

def inspect
  if success?
    {
      result: @result,
      work: @work&.to_s,
    }
  else
    {
      error: @error,
      error_code: @error_code,
      error_category: @error_category,
      error_severity: @error_severity,
      error_context: @error_context,
      work: @work&.to_s,
    }
  end
end

#retriable?Boolean

Check if error is retriable based on category

Returns:

  • (Boolean)


61
62
63
64
65
66
67
68
69
70
# File 'lib/fractor/work_result.rb', line 61

def retriable?
  return false if success?

  retriable_categories = [
    CATEGORY_TIMEOUT,
    CATEGORY_NETWORK,
    CATEGORY_RESOURCE,
  ]
  retriable_categories.include?(@error_category)
end

#success?Boolean

Returns:

  • (Boolean)


47
48
49
# File 'lib/fractor/work_result.rb', line 47

def success?
  !@error
end

#to_sObject



89
90
91
92
93
94
95
# File 'lib/fractor/work_result.rb', line 89

def to_s
  if success?
    "Result: #{@result}"
  else
    "Error: #{@error}, Code: #{@error_code}, Category: #{@error_category}, Severity: #{@error_severity}"
  end
end