Module: Trailblazer::Activity::FastTrack::DSL

Defined in:
lib/trailblazer/activity/fast_track.rb

Constant Summary collapse

Normalizers =

This is slow and should be done only once at compile-time, DISCUSS: maybe make this a function? These are the normalizers for an Trailblazer::Activity, to be injected into a State.

Linear::State::Normalizer.new(
  step: Linear::Normalizer.activity_normalizer( FastTrack::DSL.normalizer ), # here, we extend the generic FastTrack::step_normalizer with the Activity-specific DSL
  fail: Linear::Normalizer.activity_normalizer( FastTrack::DSL.normalizer_for_fail ),
  pass: Linear::Normalizer.activity_normalizer( FastTrack::DSL.normalizer_for_pass ),
)

Class Method Summary collapse

Class Method Details

.fail_fast_option(ctx) ⇒ Object



78
79
80
81
82
83
84
85
86
# File 'lib/trailblazer/activity/fast_track.rb', line 78

def fail_fast_option(ctx, **)
  ctx = merge_connections_for!(ctx, :fail_fast, :failure, **ctx)

  ctx = merge_connections_for!(ctx, :fail_fast, :fail_fast, :fail_fast, **ctx)
  ctx = merge_outputs_for!(ctx,
    {fail_fast: Activity.Output(Activity::FastTrack::FailFast, :fail_fast)},
    **ctx
  )
end

.fail_fast_option_for_fail(ctx) ⇒ Object



88
89
90
91
# File 'lib/trailblazer/activity/fast_track.rb', line 88

def fail_fast_option_for_fail(ctx, **)
  ctx = merge_connections_for!(ctx, :fail_fast, :failure, **ctx)
  ctx = merge_connections_for!(ctx, :fail_fast, :success, **ctx)
end

.fast_track_option(ctx, fast_track: false) ⇒ Object



93
94
95
96
97
98
99
100
101
102
103
104
# File 'lib/trailblazer/activity/fast_track.rb', line 93

def fast_track_option(ctx, fast_track: false, **)
  return unless fast_track

  ctx = merge_connections_for!(ctx, :fast_track, :fail_fast, :fail_fast, **ctx)
  ctx = merge_connections_for!(ctx, :fast_track, :pass_fast, :pass_fast, **ctx)

  ctx = merge_outputs_for!(ctx,
    {pass_fast: Activity.Output(Activity::FastTrack::PassFast, :pass_fast),
                fail_fast: Activity.Output(Activity::FastTrack::FailFast, :fail_fast)},
    **ctx
  )
end

.initial_sequence(initial_sequence:, fail_fast_end: Activity::End.new(semantic: :fail_fast), pass_fast_end: Activity::End.new(semantic: :pass_fast), **_o) ⇒ Object



118
119
120
121
122
123
# File 'lib/trailblazer/activity/fast_track.rb', line 118

def initial_sequence(initial_sequence:, fail_fast_end: Activity::End.new(semantic: :fail_fast), pass_fast_end: Activity::End.new(semantic: :pass_fast), **_o)
  sequence = initial_sequence

  sequence = Path::DSL.append_end(sequence, task: fail_fast_end, magnetic_to: :fail_fast, id: "End.fail_fast")
  sequence = Path::DSL.append_end(sequence, task: pass_fast_end, magnetic_to: :pass_fast, id: "End.pass_fast")
end

.merge_connections_for!(ctx, option_name, semantic, magnetic_to = option_name, connections:) ⇒ Object



106
107
108
109
110
111
# File 'lib/trailblazer/activity/fast_track.rb', line 106

def merge_connections_for!(ctx, option_name, semantic, magnetic_to=option_name, connections:, **)
  return ctx unless ctx[option_name]

  ctx[:connections] = connections.merge(semantic => [Linear::Search.method(:Forward), magnetic_to])
  ctx
end

.merge_outputs_for!(ctx, new_outputs, outputs:) ⇒ Object



113
114
115
116
# File 'lib/trailblazer/activity/fast_track.rb', line 113

def merge_outputs_for!(ctx, new_outputs, outputs:, **)
  ctx[:outputs] = new_outputs.merge(outputs)
  ctx
end

.normalizerObject



20
21
22
# File 'lib/trailblazer/activity/fast_track.rb', line 20

def normalizer
  step_options(Trailblazer::Activity::Railway::DSL.normalizer)
end

.normalizer_for_failObject



24
25
26
27
28
29
30
31
32
33
34
35
# File 'lib/trailblazer/activity/fast_track.rb', line 24

def normalizer_for_fail
  pipeline = step_options(Trailblazer::Activity::Railway::DSL.normalizer_for_fail)

  TaskWrap::Pipeline.prepend(
    pipeline,
    "path.wirings",

    {
      "fast_track.fail_fast_option_for_fail"  => Linear::Normalizer.Task(method(:fail_fast_option_for_fail)),
    }
  )
end

.normalizer_for_passObject



37
38
39
40
41
42
43
44
45
46
47
48
# File 'lib/trailblazer/activity/fast_track.rb', line 37

def normalizer_for_pass
  pipeline = step_options(Trailblazer::Activity::Railway::DSL.normalizer_for_pass)

  TaskWrap::Pipeline.prepend(
    pipeline,
    "path.wirings",

    {
      "fast_track.pass_fast_option_for_pass"  => Linear::Normalizer.Task(method(:pass_fast_option_for_pass)),
    }
  )
end

.OptionsForState(normalizers: Normalizers, **options) ⇒ Object



134
135
136
137
138
139
140
141
142
143
144
# File 'lib/trailblazer/activity/fast_track.rb', line 134

def self.OptionsForState(normalizers: Normalizers, **options)
  options = Railway::DSL.OptionsForState(**options).
      merge(normalizers: normalizers)

  initial_sequence = FastTrack::DSL.initial_sequence(**options)

  {
    **options,
    initial_sequence: initial_sequence,
  }
end

.pass_fast_option(ctx) ⇒ Object



63
64
65
66
67
68
69
70
71
# File 'lib/trailblazer/activity/fast_track.rb', line 63

def pass_fast_option(ctx, **)
  ctx = merge_connections_for!(ctx, :pass_fast, :success, **ctx)

  ctx = merge_connections_for!(ctx, :pass_fast, :pass_fast, :pass_fast, **ctx)
  ctx = merge_outputs_for!(ctx,
    {pass_fast: Activity.Output(Activity::FastTrack::PassFast, :pass_fast)},
    **ctx
  )
end

.pass_fast_option_for_pass(ctx) ⇒ Object



73
74
75
76
# File 'lib/trailblazer/activity/fast_track.rb', line 73

def pass_fast_option_for_pass(ctx, **)
  ctx = merge_connections_for!(ctx, :pass_fast, :failure, **ctx)
  ctx = merge_connections_for!(ctx, :pass_fast, :success, **ctx)
end

.step_options(pipeline) ⇒ Object



50
51
52
53
54
55
56
57
58
59
60
61
# File 'lib/trailblazer/activity/fast_track.rb', line 50

def step_options(pipeline)
  TaskWrap::Pipeline.prepend(
    pipeline,
    "path.wirings",

    {
      "fast_track.pass_fast_option"  => Linear::Normalizer.Task(method(:pass_fast_option)),
      "fast_track.fail_fast_option"  => Linear::Normalizer.Task(method(:fail_fast_option)),
      "fast_track.fast_track_option" => Linear::Normalizer.Task(method(:fast_track_option)),
    }
  )
end