module Siresta::API

Public Class Methods

included(base) click to toggle source
# File lib/siresta/api.rb, line 91
def self.included(base)
  base.extend ClassMethods
end

Public Instance Methods

_begin_state() click to toggle source

begin state for Response monad

# File lib/siresta/api.rb, line 47
def _begin_state
  r = Response
  r.ResponseState(
    r.RequestData(
      {}, # TODO: headers
      request.body.read, params
    ),
    r.ResponseInfo(nil, {}, r.ResponseEmpty()),
    r.ResponseContinue(), self
  )
end
_handle_request(meth, path, formats, pipe, handler) click to toggle source

handle request for generated route

# File lib/siresta/api.rb, line 21
def _handle_request(meth, path, formats, pipe, handler)
  b   = method handler
  r   = Response
  fs  = []  # TODO

  fs << r.choose_request_format(handler, formats) \
    unless formats[:request].empty?
  fs << r.get
  fs << -> s { b[r, s.request.headers, s.request.params, s.request.body] }
  fs << r.choose_response_format(handler, formats) \
    unless formats[:response].empty?

  x   = r.pipeline(r.return(nil), *fs)
  s   = x.exec _begin_state

  # TODO
  if s.status.is_a? r::ResponseError
    [500, s.status.message]
  elsif s.response.data.is_a? r::ResponseBody
    [s.response.status, s.response.headers, s.response.data.data]
  else
    raise 'OOPS'  # TODO
  end
end
convert_from(handler, formats, body) click to toggle source

convert from preferred format

# File lib/siresta/api.rb, line 71
def convert_from(handler, formats, body)
  f_in, f_out = preferred_formats formats
  ss          = settings.siresta[:convert_from][f_in] || {}
  f           = ss[handler] || ss[:__all__]
  f ? f[body] : raise('OOPS')   # TODO
end
convert_to(handler, formats, body) click to toggle source

convert to preferred format

# File lib/siresta/api.rb, line 79
def convert_to(handler, formats, body)
  f_in, f_out = preferred_formats formats
  ss          = settings.siresta[:convert_to][f_out] || {}
  f           = ss[handler] || ss[:__all__]
  f ? f[body] : raise('OOPS')   # TODO
end
data() click to toggle source

atoms

# File lib/siresta/api.rb, line 87
def data
  settings.siresta[:data]
end
preferred_formats(formats) click to toggle source

preferred formats

# File lib/siresta/api.rb, line 60
def preferred_formats(formats)
  @preferred_formats ||= {}
  return @preferred_formats[formats] if @preferred_formats[formats]
  fmts  = formats[:request] | formats[:response]
  m2f   = Hash[fmts.map { |x| [mime_type(x), x] }]
  f_in  = m2f[request.content_type] || formats[:request].first
  f_out = m2f[request.preferred_type m2f.keys]
  @preferred_formats[formats] = [f_in, f_out]
end