Module: Superhosting::Helper::States

Included in:
Controller::Container, Controller::Site
Defined in:
lib/superhosting/helper/states.rb

Instance Method Summary collapse

Instance Method Details

#method_options(method_name, options) ⇒ Object



38
39
40
41
42
43
44
45
46
# File 'lib/superhosting/helper/states.rb', line 38

def method_options(method_name, options)
  method = self.method(method_name)
  opts = {}
  method.parameters.each do |req, name|
    opt = options[name]
    opts.merge!(name => opt)
  end
  opts
end

#on_state(states:, state_mapper:, **options) ⇒ Object



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
# File 'lib/superhosting/helper/states.rb', line 4

def on_state(states:, state_mapper:, **options)
  current_state = state_mapper.state default: :none

  while (state = states[current_state.to_sym]) do
    method = state[:action]
    opts = method_options(method, options)

    self.debug_block(desc: { code: :transition, data: { name: method } }) do
      unless (resp = self.send(method, opts)).net_status_ok?
        resp.net_status_ok!
      end

      if state[:next].nil?
        state_mapper.state.delete!(full: true, logger: false)
      else
        self.set_state(name: options[:name], state: state[:next])
      end
    end
    break if (current_state = state[:next]).nil?
  end
  {}
rescue Exception => e
  undo_method = state[:undo] || :"undo_#{method}"

  if respond_to? undo_method
    self.debug_block(desc: { code: :transition_undo, data: { name: undo_method } }) do
      opts = method_options(undo_method, options)
      self.send(undo_method, opts)
    end
  end

  raise
end

#set_state(name:, state:) ⇒ Object



53
54
55
56
57
58
59
60
61
62
63
64
65
66
# File 'lib/superhosting/helper/states.rb', line 53

def set_state(name:, state:)
  state_mapper = self.state(name: name)
  old_state = state_mapper.value
  self.debug_operation(desc: { code: :change_state, data: { obj: name, from: old_state, to: state } }) do |&b|
    self.with_logger(logger: false) do
      if state.nil?
        state_mapper.delete!(full: full)
      else
        state_mapper.put!(state)
      end
    end
    b.call(code: :ok)
  end
end

#state(name:) ⇒ Object



48
49
50
51
# File 'lib/superhosting/helper/states.rb', line 48

def state(name:)
  self.existing_validation(name: name).net_status_ok!
  self.index[name][:state_mapper]
end