Module: Siresta::API

Included in:
ApiBase
Defined in:
lib/siresta/api.rb

Defined Under Namespace

Modules: ClassMethods

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.included(base) ⇒ Object



91
92
93
# File 'lib/siresta/api.rb', line 91

def self.included(base)
  base.extend ClassMethods
end

Instance Method Details

#_begin_stateObject

begin state for Response monad



47
48
49
50
51
52
53
54
55
56
57
# 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) ⇒ Object

handle request for generated route



21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
# 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) ⇒ Object

convert from preferred format



71
72
73
74
75
76
# 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) ⇒ Object

convert to preferred format



79
80
81
82
83
84
# 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

#dataObject

atoms



87
88
89
# File 'lib/siresta/api.rb', line 87

def data
  settings.siresta[:data]
end

#preferred_formats(formats) ⇒ Object

preferred formats



60
61
62
63
64
65
66
67
68
# 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