class Sorta::Http::Web::App

Public Class Methods

build(&block) click to toggle source
# File lib/sorta/http/web/app.rb, line 20
def self.build(&block)
  app = new
  app.instance_exec(&block)
  app
end
build_from(template) click to toggle source
# File lib/sorta/http/web/app.rb, line 13
def self.build_from(template)
  dependencies = [
    Router.build_from(template.router)
  ]
  new(*dependencies)
end
new(router = Router.new) click to toggle source
# File lib/sorta/http/web/app.rb, line 26
def initialize(router = Router.new)
  @router = router
end

Public Instance Methods

call(env) click to toggle source
# File lib/sorta/http/web/app.rb, line 30
def call(env)
  result = @router.find(env)

  unless result.found?
    msg = "Cannot find #{env['REQUEST_METHOD']} action for route \"#{env['PATH_INFO']}\""
    logger.error msg
    return [404, {}, [msg]]
  end

  params = result.params
  params = result.payload[:schema].call(params) unless result.payload[:schema].nil?
  response = result.payload[:action].new(env).call(params)
  logger.info "#{response[0]} #{env['REQUEST_METHOD']} \"#{env['PATH_INFO']}\" #{result.payload[:action]} #{params.inspect}: #{response[2].join}"
  response
rescue ParamsValidator::ValidationError => e
  logger.info "#{500} #{env['REQUEST_METHOD']} \"#{env['PATH_INFO']}\" #{result.payload[:action]} #{params.inspect}: #{e.message}"
  [500, {}, [e.message]]
end

Private Instance Methods

logger() click to toggle source
# File lib/sorta/http/web/app.rb, line 51
def logger
  Ractor.current[:logger]
end
routes() { |router| ... } click to toggle source
# File lib/sorta/http/web/app.rb, line 55
def routes
  yield @router
end