class Pastafari::Builders::FsmBuilder

Constants

VALID_TRANSITIONS

Public Class Methods

new() click to toggle source
# File lib/pastafari/builders/fsm_builder.rb, line 6
def initialize
  @states = {}
  @transition_at = :after
end

Public Instance Methods

build() click to toggle source
# File lib/pastafari/builders/fsm_builder.rb, line 30
def build
  validate_states_given
  validate_initial_state
  validate_transitions

  set_initial_state!

  Pastafari::Fsm.new(@states, @transition_at, @initial_state)
end
initial_state(state) click to toggle source
# File lib/pastafari/builders/fsm_builder.rb, line 26
def initial_state(state)
  @initial_state = state
end
state(name, &block) click to toggle source
# File lib/pastafari/builders/fsm_builder.rb, line 11
def state(name, &block)
  builder = Builders::StateBuilder.new(name)
  builder.instance_eval(&block)

  state = builder.build

  @states[state.name] = state
end
transition(at) click to toggle source
# File lib/pastafari/builders/fsm_builder.rb, line 20
def transition(at)
  validate_transition_at(at)

  @transition_at = at
end

Private Instance Methods

set_initial_state!() click to toggle source
# File lib/pastafari/builders/fsm_builder.rb, line 42
def set_initial_state!
  @initial_state ||= @states.values.first.name
end
validate_initial_state() click to toggle source
# File lib/pastafari/builders/fsm_builder.rb, line 58
def validate_initial_state
  return unless @initial_state

  return if @states.key?(@initial_state)

  raise Pastafari::Errors::InvalidStateError,
        'Initial state points to a non-existent state.'
end
validate_states_given() click to toggle source
# File lib/pastafari/builders/fsm_builder.rb, line 52
def validate_states_given
  return unless @states.length.zero?

  raise Pastafari::Errors::InvalidStateError, 'No states defined.'
end
validate_transition_at(at) click to toggle source
# File lib/pastafari/builders/fsm_builder.rb, line 46
def validate_transition_at(at)
  return if VALID_TRANSITIONS.include?(at)

  raise ArgumentError, 'Transition value must be one of :before, :after.'
end
validate_transitions() click to toggle source
# File lib/pastafari/builders/fsm_builder.rb, line 67
def validate_transitions
  @states.each do |name, state|
    state.transitions.map(&:next_state).each do |k|
      next if @states.key? k

      raise Pastafari::Errors::InvalidStateError,
            "State #{name} is transitioning to non-existent state #{k}"
    end
  end
end