1 | {resource} = require "shred"
|
2 | {call} = require "when/generator"
|
3 |
|
4 | describe = (url, api) ->
|
5 | root = {}
|
6 | for rname, {actions} of api.resources
|
7 | description = {}
|
8 | for aname, {method, request, response} of actions
|
9 | description[aname] = action = {method}
|
10 | if request?
|
11 | if request.type?
|
12 | action.headers = "content-type": request.type
|
13 | if response?
|
14 | if response.type?
|
15 | action.headers ?= {}
|
16 | action.headers.accept = response.type
|
17 | if response.status?
|
18 | action.expect = response.status
|
19 | do (rname, description) ->
|
20 | root[rname] = (resource) ->
|
21 | {template, path, query} = api.mappings[rname]
|
22 |
|
23 | if path?
|
24 | resource path, description
|
25 | else if template?
|
26 | components = for component in (template.split "/")[1..]
|
27 | if component[0] == ":"
|
28 | key = component[1..]
|
29 | "{#{key}}"
|
30 | else
|
31 | component
|
32 | resource ("/" + components.join "/"), description
|
33 |
|
34 | resource url, root
|
35 |
|
36 | discover = (discovery, url) ->
|
37 | url ?= discovery
|
38 |
|
39 | service = resource discovery,
|
40 | description: (resource) ->
|
41 | resource "/",
|
42 | get:
|
43 | method: "get"
|
44 | headers:
|
45 | "accept": "application/json"
|
46 | expect: 200
|
47 |
|
48 | call ->
|
49 | {data} = yield service.description.get()
|
50 | api = yield data
|
51 | describe url, api
|
52 |
|
53 |
|
54 |
|
55 | module.exports = {discover, describe}
|