module Superhosting::Helper::States

Public Instance Methods

method_options(method_name, options) click to toggle source
# 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) click to toggle source
# 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:) click to toggle source
# 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:) click to toggle source
# 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