discourse/lib/service/base/try_step.rb
Loïc Guitaut 6759ad71ca
DEV: Extract step classes from Service::Base into individual files (#37956)
The `base.rb` file (640+ lines) contained 9 step classes, the `Context`
class, and the `StepsHelpers` DSL module alongside the core concern.
Each is now in its own file under `lib/service/base/`, following the
existing `lib/service.rb` + `lib/service/*.rb` pattern.

Also:
- Update stale inline documentation in `lib/service.rb`
- Use `NotImplementedError` instead of generic raise in `PolicyBase` and
`ActionBase`
- Move YARD DSL docs to a `@!parse` block at the top of `base.rb`
2026-02-23 09:49:37 +01:00

44 lines
1.1 KiB
Ruby

# frozen_string_literal: true
module Service
module Base
# @!visibility private
class TryStep < Step
module FilteredBacktrace
def filtered_backtrace
Array
.wrap(backtrace)
.chunk { it.match?(%r{/(gems|lib/service|ruby)/}) }
.flat_map do |excluded, lines|
next "(#{lines.size} framework line(s) excluded)" if excluded
lines
end
end
end
include StepsHelpers
attr_reader :steps, :exceptions
def initialize(exceptions, &block)
super("default")
@steps = []
@exceptions = exceptions.presence || [StandardError]
instance_exec(&block)
end
def run_step
steps.each do |step|
@current_step = step
step.call(instance, context)
end
rescue *exceptions => e
raise e if e.is_a?(Failure)
e.singleton_class.prepend(FilteredBacktrace)
context[@current_step.result_key].fail(raised_exception?: true, exception: e)
context[result_key][:exception] = e
context.fail!
end
end
end
end