-
Notifications
You must be signed in to change notification settings - Fork 24
/
operation.rb
90 lines (69 loc) · 2.78 KB
/
operation.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
require "forwardable"
# trailblazer-context
require "trailblazer/option"
require "trailblazer/context"
require "trailblazer/container_chain"
require "trailblazer/activity"
require "trailblazer/activity/dsl/magnetic"
require "trailblazer/operation/callable"
require "trailblazer/operation/heritage"
require "trailblazer/operation/public_call" # TODO: Remove in 3.0.
require "trailblazer/operation/class_dependencies"
require "trailblazer/operation/deprecated_macro" # TODO: remove in 2.2.
require "trailblazer/operation/result"
require "trailblazer/operation/railway"
require "trailblazer/operation/railway/fast_track"
require "trailblazer/operation/railway/normalizer"
require "trailblazer/operation/trace"
require "trailblazer/operation/railway/macaroni"
module Trailblazer
# The Trailblazer-style operation.
# Note that you don't have to use our "opinionated" version with result object, skills, etc.
class Operation
module FastTrackActivity
builder_options = {
track_end: Railway::End::Success.new(semantic: :success),
failure_end: Railway::End::Failure.new(semantic: :failure),
pass_fast_end: Railway::End::PassFast.new(semantic: :pass_fast),
fail_fast_end: Railway::End::FailFast.new(semantic: :fail_fast)
}
extend Activity::FastTrack(pipeline: Railway::Normalizer::Pipeline, builder_options: builder_options)
end
extend Skill::Accessors # ::[] and ::[]= # TODO: fade out this usage.
def self.inherited(subclass)
super
subclass.initialize!
heritage.(subclass)
end
def self.initialize!
@activity = FastTrackActivity.clone
end
extend Activity::Interface
module Process
def to_h
@activity.to_h.merge(activity: @activity)
end
end
extend Process # make ::call etc. class methods on Operation.
extend Heritage::Accessor
class << self
extend Forwardable # TODO: test those helpers
def_delegators :@activity, :Path, :Output, :End, :Track
def_delegators :@activity, :outputs
# rubocop:disable Layout/EmptyLineBetweenDefs
def step(task, options = {}, &block); add_task!(:step, task, options, &block) end
def pass(task, options = {}, &block); add_task!(:pass, task, options, &block) end
def fail(task, options = {}, &block); add_task!(:fail, task, options, &block) end
# rubocop:enable Layout/EmptyLineBetweenDefs
alias_method :success, :pass
alias_method :failure, :fail
def add_task!(name, task, options, &block)
heritage.record(name, task, options, &block)
@activity.send(name, task, options, &block)
end
end
extend PublicCall # ::call(params, { current_user: .. })
extend Trace # ::trace
end
end
require "trailblazer/operation/inspect"