class Gambiarra::App

Attributes

app_class[R]
debugging[R]
router[R]

Public Class Methods

app() click to toggle source
# File lib/gambiarra/app.rb, line 29
def self.app
  @app ||= new
end
inherited(app_class) click to toggle source
# File lib/gambiarra/app.rb, line 10
def inherited(app_class)
  @app_class = app_class
end
new(debugging: false) click to toggle source
# File lib/gambiarra/app.rb, line 33
def initialize(debugging: false)
  debugging = true
  setup if respond_to?(:setup)
  @debugging = debugging
  @router = Router.new
end
start(initial_route='') click to toggle source
# File lib/gambiarra/app.rb, line 15
def self.start(initial_route='')
  path, params = initial_route.split(' ').each_with_object([nil, {}]) do |segment, memo|
    if segment =~ /:/
      key, value = segment.split(':')
      memo[1].merge!([[key.to_sym, value.gsub('-', ' ')]].to_h)
    else
      memo[0] = [memo[0], segment].compact.join(' ')
    end
  end

  response = {path: (path || ''), **params}
  loop { response = app.flow(**response) }
end

Public Instance Methods

app_name() click to toggle source
# File lib/gambiarra/app.rb, line 70
def app_name
  self.class.to_s.split('::').first.underscore.gsub('_', '-')
end
ask_question(question) click to toggle source
# File lib/gambiarra/app.rb, line 44
def ask_question(question)
  CLI::UI::Prompt.ask(question[:statement], options: question[:options])
end
ask_questions(questions) click to toggle source
# File lib/gambiarra/app.rb, line 40
def ask_questions(questions)
  questions.map { |name, question| [name, ask_question(question)] }.to_h
end
exit() click to toggle source
# File lib/gambiarra/app.rb, line 90
def exit
  Kernel.exit(0)
end
flow(response) click to toggle source
# File lib/gambiarra/app.rb, line 74
def flow(response)
  raise 'Response is empty' unless response
  output(response)
  response.delete(:content)
  questions = response&.delete(:questions) || {}
  response.merge!(navigation(response)) unless response.has_key?(:path) || questions.any?
  response.merge!(ask_questions(questions)) if questions.any?
  exit if response[:path] == 'exit'
  router.get(**response.compact)
rescue => e
  puts e.backtrace if debugging
  puts e
  response.delete(:path)
  retry unless debugging
end
navigation(params) click to toggle source
output(response) click to toggle source
# File lib/gambiarra/app.rb, line 59
def output(response)
  return unless response[:content]
  puts [
    nil,
    "-> #{app_name} #{router.url}",
    nil,
    response[:content],
    nil
  ]
end