redsnow 0.2.0 → 0.2.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (55) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +3 -1
  3. data/README.md +12 -0
  4. data/ext/snowcrash/bin/snowcrash +0 -0
  5. data/ext/snowcrash/ext/markdown-parser/ext/sundown/src/markdown.c +5 -2
  6. data/ext/snowcrash/snowcrash.gyp +7 -2
  7. data/ext/snowcrash/src/ActionParser.h +141 -81
  8. data/ext/snowcrash/src/AssetParser.h +19 -11
  9. data/ext/snowcrash/src/Blueprint.h +44 -14
  10. data/ext/snowcrash/src/BlueprintParser.h +65 -51
  11. data/ext/snowcrash/src/BlueprintSourcemap.h +254 -0
  12. data/ext/snowcrash/src/BlueprintUtility.h +3 -24
  13. data/ext/snowcrash/src/CBlueprint.cc +40 -31
  14. data/ext/snowcrash/src/CBlueprint.h +54 -58
  15. data/ext/snowcrash/src/CBlueprintSourcemap.cc +620 -0
  16. data/ext/snowcrash/src/CBlueprintSourcemap.h +342 -0
  17. data/ext/snowcrash/src/CSourceAnnotation.cc +14 -0
  18. data/ext/snowcrash/src/CodeBlockUtility.h +42 -5
  19. data/ext/snowcrash/src/HeadersParser.h +84 -42
  20. data/ext/snowcrash/src/ParameterParser.h +110 -68
  21. data/ext/snowcrash/src/ParametersParser.h +26 -28
  22. data/ext/snowcrash/src/PayloadParser.h +164 -83
  23. data/ext/snowcrash/src/ResourceGroupParser.h +35 -41
  24. data/ext/snowcrash/src/ResourceParser.h +142 -97
  25. data/ext/snowcrash/src/SectionParser.h +15 -14
  26. data/ext/snowcrash/src/SectionParserData.h +11 -2
  27. data/ext/snowcrash/src/SectionProcessor.h +42 -18
  28. data/ext/snowcrash/src/Serialize.cc +2 -0
  29. data/ext/snowcrash/src/Serialize.h +3 -1
  30. data/ext/snowcrash/src/SerializeJSON.cc +608 -16
  31. data/ext/snowcrash/src/SerializeJSON.h +4 -1
  32. data/ext/snowcrash/src/SerializeYAML.cc +367 -19
  33. data/ext/snowcrash/src/SerializeYAML.h +4 -1
  34. data/ext/snowcrash/src/SymbolTable.h +12 -1
  35. data/ext/snowcrash/src/ValuesParser.h +12 -11
  36. data/ext/snowcrash/src/Version.h +1 -1
  37. data/ext/snowcrash/src/csnowcrash.cc +7 -3
  38. data/ext/snowcrash/src/csnowcrash.h +4 -2
  39. data/ext/snowcrash/src/snowcrash.cc +10 -11
  40. data/ext/snowcrash/src/snowcrash.h +3 -3
  41. data/ext/snowcrash/src/snowcrash/snowcrash.cc +38 -8
  42. data/ext/snowcrash/tools/homebrew/snowcrash.rb +1 -1
  43. data/lib/redsnow.rb +41 -2
  44. data/lib/redsnow/binding.rb +93 -8
  45. data/lib/redsnow/blueprint.rb +48 -25
  46. data/lib/redsnow/parseresult.rb +9 -2
  47. data/lib/redsnow/sourcemap.rb +369 -0
  48. data/lib/redsnow/version.rb +1 -1
  49. data/test/fixtures/sample-api-ast.json +1 -1
  50. data/test/fixtures/sample-api-sourcemap.json +169 -0
  51. data/test/redsnow_binding_test.rb +19 -2
  52. data/test/redsnow_options_test.rb +42 -0
  53. data/test/redsnow_parseresult_test.rb +5 -1
  54. data/test/redsnow_test.rb +5 -0
  55. metadata +11 -2
@@ -40,32 +40,40 @@ namespace snowcrash {
40
40
  const MarkdownNodes& siblings,
41
41
  SectionParserData& pd,
42
42
  SectionLayout& layout,
43
- Report& report,
44
- Asset& out) {
43
+ ParseResult<Asset>& out) {
45
44
 
46
- out = "";
47
- CodeBlockUtility::signatureContentAsCodeBlock(node, pd, report, out);
45
+ out.node = "";
46
+ CodeBlockUtility::signatureContentAsCodeBlock(node, pd, out.report, out.node);
47
+
48
+ if (pd.exportSourceMap() && !out.node.empty()) {
49
+ out.sourceMap.sourceMap.append(node->sourceMap);
50
+ }
51
+
48
52
  return ++MarkdownNodeIterator(node);
49
53
  }
50
54
 
51
55
  static MarkdownNodeIterator processDescription(const MarkdownNodeIterator& node,
52
56
  const MarkdownNodes& siblings,
53
57
  SectionParserData& pd,
54
- Report& report,
55
- Asset& out) {
58
+ ParseResult<Asset>& out) {
59
+
56
60
  return node;
57
61
  }
58
62
 
59
63
  static MarkdownNodeIterator processContent(const MarkdownNodeIterator& node,
60
64
  const MarkdownNodes& siblings,
61
65
  SectionParserData& pd,
62
- Report& report,
63
- Asset& out) {
64
-
66
+ ParseResult<Asset>& out) {
65
67
 
66
68
  mdp::ByteBuffer content;
67
- CodeBlockUtility::contentAsCodeBlock(node, pd, report, content);
68
- out += content;
69
+ CodeBlockUtility::contentAsCodeBlock(node, pd, out.report, content);
70
+
71
+ out.node += content;
72
+
73
+ if (pd.exportSourceMap() && !content.empty()) {
74
+ out.sourceMap.sourceMap.append(node->sourceMap);
75
+ }
76
+
69
77
  return ++MarkdownNodeIterator(node);
70
78
  }
71
79
 
@@ -80,7 +80,16 @@ namespace snowcrash {
80
80
  * E.g. "Content-Type: application/json"
81
81
  */
82
82
  typedef KeyValuePair Header;
83
+
84
+ /** Metadata Collection */
85
+ typedef Collection<Metadata>::type MetadataCollection;
86
+
87
+ /** Headers */
88
+ typedef Collection<Header>::type Headers;
83
89
 
90
+ /** Collection of Parameter Values */
91
+ typedef Collection<Value>::type Values;
92
+
84
93
  /** Parameter Use flag */
85
94
  enum ParameterUse {
86
95
  UndefinedParameterUse,
@@ -110,9 +119,12 @@ namespace snowcrash {
110
119
  Value exampleValue;
111
120
 
112
121
  /** Enumeration of possible values */
113
- Collection<Value>::type values;
122
+ Values values;
114
123
  };
115
124
 
125
+ /** Source Map of Collection of Parameters */
126
+ typedef Collection<Parameter>::type Parameters;
127
+
116
128
  /** Name of a symbol */
117
129
  typedef std::string SymbolName;
118
130
 
@@ -128,10 +140,10 @@ namespace snowcrash {
128
140
  Description description;
129
141
 
130
142
  /** Payload-specific Parameters */
131
- Collection<Parameter>::type parameters;
143
+ Parameters parameters;
132
144
 
133
145
  /** Payload-specific Headers */
134
- Collection<Header>::type headers;
146
+ Headers headers;
135
147
 
136
148
  /** Body */
137
149
  Asset body;
@@ -157,6 +169,12 @@ namespace snowcrash {
157
169
  */
158
170
  typedef Payload Response;
159
171
 
172
+ /** Collection of Requests */
173
+ typedef Collection<Request>::type Requests;
174
+
175
+ /** Collection of Responses */
176
+ typedef Collection<Response>::type Responses;
177
+
160
178
  /**
161
179
  * An HTTP transaction example.
162
180
  */
@@ -169,12 +187,15 @@ namespace snowcrash {
169
187
  Description description;
170
188
 
171
189
  /** Requests */
172
- Collection<Request>::type requests;
190
+ Requests requests;
173
191
 
174
192
  /** Responses */
175
- Collection<Response>::type responses;
193
+ Responses responses;
176
194
  };
177
195
 
196
+ /** Collection of Transaction examples */
197
+ typedef Collection<TransactionExample>::type TransactionExamples;
198
+
178
199
  /**
179
200
  * Action
180
201
  */
@@ -190,7 +211,7 @@ namespace snowcrash {
190
211
  Description description;
191
212
 
192
213
  /** Action-specific Parameters */
193
- Collection<Parameter>::type parameters;
214
+ Parameters parameters;
194
215
 
195
216
  /**
196
217
  * \brief Action-specific HTTP headers
@@ -204,12 +225,15 @@ namespace snowcrash {
204
225
  *
205
226
  * Use respective payload's header collection instead.
206
227
  */
207
- DEPRECATED Collection<Header>::type headers;
228
+ DEPRECATED Headers headers;
208
229
 
209
230
  /** Transactions examples */
210
- Collection<TransactionExample>::type examples;
231
+ TransactionExamples examples;
211
232
  };
212
233
 
234
+ /** Collection of Actions */
235
+ typedef Collection<Action>::type Actions;
236
+
213
237
  /**
214
238
  * API Resource
215
239
  */
@@ -228,7 +252,7 @@ namespace snowcrash {
228
252
  ResourceModel model;
229
253
 
230
254
  /** Parameters */
231
- Collection<Parameter>::type parameters;
255
+ Parameters parameters;
232
256
 
233
257
  /**
234
258
  * \brief Resource-specific HTTP Headers
@@ -242,12 +266,15 @@ namespace snowcrash {
242
266
  *
243
267
  * Use respective payload's header collection instead.
244
268
  */
245
- DEPRECATED Collection<Header>::type headers;
269
+ DEPRECATED Headers headers;
246
270
 
247
271
  /** A set of Actions specified for this Resource */
248
- Collection<Action>::type actions;
272
+ Actions actions;
249
273
  };
250
274
 
275
+ /** Collection of Resources */
276
+ typedef Collection<Resource>::type Resources;
277
+
251
278
  /**
252
279
  * Group of API Resources
253
280
  */
@@ -260,9 +287,12 @@ namespace snowcrash {
260
287
  Description description;
261
288
 
262
289
  /** Resources */
263
- Collection<Resource>::type resources;
290
+ Resources resources;
264
291
  };
265
292
 
293
+ /** Collection of Resource groups */
294
+ typedef Collection<ResourceGroup>::type ResourceGroups;
295
+
266
296
  /**
267
297
  * \brief API Blueprint AST
268
298
  *
@@ -272,7 +302,7 @@ namespace snowcrash {
272
302
  struct Blueprint {
273
303
 
274
304
  /** Metadata */
275
- Collection<Metadata>::type metadata;
305
+ MetadataCollection metadata;
276
306
 
277
307
  /** The API Name */
278
308
  Name name;
@@ -281,7 +311,7 @@ namespace snowcrash {
281
311
  Description description;
282
312
 
283
313
  /** The set of API Resource Groups */
284
- Collection<ResourceGroup>::type resourceGroups;
314
+ ResourceGroups resourceGroups;
285
315
  };
286
316
  }
287
317
 
@@ -19,9 +19,7 @@ namespace snowcrash {
19
19
 
20
20
  const char* const ExpectedAPINameMessage = "expected API name, e.g. '# <API Name>'";
21
21
 
22
- /** Internal type alias for Collection of Metadata */
23
- typedef Collection<Metadata>::type MetadataCollection;
24
-
22
+ /** Internal type alias for Collection iterator of Metadata */
25
23
  typedef Collection<Metadata>::iterator MetadataCollectionIterator;
26
24
 
27
25
  /**
@@ -34,22 +32,27 @@ namespace snowcrash {
34
32
  const MarkdownNodes& siblings,
35
33
  SectionParserData& pd,
36
34
  SectionLayout& layout,
37
- Report& report,
38
- Blueprint& out) {
35
+ ParseResult<Blueprint>& out) {
39
36
 
40
37
  MarkdownNodeIterator cur = node;
41
38
 
42
39
  while (cur != siblings.end() &&
43
40
  cur->type == mdp::ParagraphMarkdownNodeType) {
44
41
 
45
- MetadataCollection metadata;
46
- parseMetadata(cur, pd, report, metadata);
42
+ ParseResult<MetadataCollection> metadata(out.report);
43
+ parseMetadata(cur, pd, metadata);
47
44
 
48
45
  // First block is paragraph and is not metadata (no API name)
49
- if (metadata.empty()) {
50
- return processDescription(cur, siblings, pd, report, out);
46
+ if (metadata.node.empty()) {
47
+ return processDescription(cur, siblings, pd, out);
51
48
  } else {
52
- out.metadata.insert(out.metadata.end(), metadata.begin(), metadata.end());
49
+ out.node.metadata.insert(out.node.metadata.end(), metadata.node.begin(), metadata.node.end());
50
+
51
+ if (pd.exportSourceMap()) {
52
+ out.sourceMap.metadata.collection.insert(out.sourceMap.metadata.collection.end(),
53
+ metadata.sourceMap.collection.begin(),
54
+ metadata.sourceMap.collection.end());
55
+ }
53
56
  }
54
57
 
55
58
  cur++;
@@ -70,12 +73,16 @@ namespace snowcrash {
70
73
  return cur;
71
74
  }
72
75
 
73
- out.name = cur->text;
74
- TrimString(out.name);
76
+ out.node.name = cur->text;
77
+ TrimString(out.node.name);
78
+
79
+ if (pd.exportSourceMap() && !out.node.name.empty()) {
80
+ out.sourceMap.name.sourceMap = cur->sourceMap;
81
+ }
75
82
  } else {
76
83
 
77
84
  // Any other type of block, add to description
78
- return processDescription(cur, siblings, pd, report, out);
85
+ return processDescription(cur, siblings, pd, out);
79
86
  }
80
87
 
81
88
  return ++MarkdownNodeIterator(cur);
@@ -84,37 +91,40 @@ namespace snowcrash {
84
91
  static MarkdownNodeIterator processNestedSection(const MarkdownNodeIterator& node,
85
92
  const MarkdownNodes& siblings,
86
93
  SectionParserData& pd,
87
- Report& report,
88
- Blueprint& out) {
94
+ ParseResult<Blueprint>& out) {
89
95
 
90
96
  if (pd.sectionContext() == ResourceGroupSectionType ||
91
97
  pd.sectionContext() == ResourceSectionType) {
92
98
 
93
- ResourceGroup resourceGroup;
94
- MarkdownNodeIterator cur = ResourceGroupParser::parse(node, siblings, pd, report, resourceGroup);
99
+ ParseResult<ResourceGroup> resourceGroup(out.report);
100
+ MarkdownNodeIterator cur = ResourceGroupParser::parse(node, siblings, pd, resourceGroup);
95
101
 
96
- ResourceGroupIterator duplicate = findResourceGroup(out.resourceGroups, resourceGroup);
102
+ ResourceGroupIterator duplicate = findResourceGroup(out.node.resourceGroups, resourceGroup.node);
97
103
 
98
- if (duplicate != out.resourceGroups.end()) {
104
+ if (duplicate != out.node.resourceGroups.end()) {
99
105
 
100
106
  // WARN: duplicate resource group
101
107
  std::stringstream ss;
102
108
 
103
- if (resourceGroup.name.empty()) {
109
+ if (resourceGroup.node.name.empty()) {
104
110
  ss << "anonymous group";
105
111
  } else {
106
- ss << "group '" << resourceGroup.name << "'";
112
+ ss << "group '" << resourceGroup.node.name << "'";
107
113
  }
108
114
 
109
115
  ss << " is already defined";
110
116
 
111
117
  mdp::CharactersRangeSet sourceMap = mdp::BytesRangeSetToCharactersRangeSet(node->sourceMap, pd.sourceData);
112
- report.warnings.push_back(Warning(ss.str(),
113
- DuplicateWarning,
114
- sourceMap));
118
+ out.report.warnings.push_back(Warning(ss.str(),
119
+ DuplicateWarning,
120
+ sourceMap));
115
121
  }
116
122
 
117
- out.resourceGroups.push_back(resourceGroup);
123
+ out.node.resourceGroups.push_back(resourceGroup.node);
124
+
125
+ if (pd.exportSourceMap()) {
126
+ out.sourceMap.resourceGroups.collection.push_back(resourceGroup.sourceMap);
127
+ }
118
128
 
119
129
  return cur;
120
130
  }
@@ -161,26 +171,25 @@ namespace snowcrash {
161
171
 
162
172
  static void finalize(const MarkdownNodeIterator& node,
163
173
  SectionParserData& pd,
164
- Report& report,
165
- Blueprint& out) {
174
+ ParseResult<Blueprint>& out) {
166
175
 
167
- if (!out.name.empty())
176
+ if (!out.node.name.empty())
168
177
  return;
169
178
 
170
179
  if (pd.options & RequireBlueprintNameOption) {
171
180
 
172
181
  // ERR: No API name specified
173
182
  mdp::CharactersRangeSet sourceMap = mdp::BytesRangeSetToCharactersRangeSet(node->sourceMap, pd.sourceData);
174
- report.error = Error(ExpectedAPINameMessage,
175
- BusinessError,
176
- sourceMap);
183
+ out.report.error = Error(ExpectedAPINameMessage,
184
+ BusinessError,
185
+ sourceMap);
177
186
 
178
187
  }
179
- else if (!out.description.empty()) {
188
+ else if (!out.node.description.empty()) {
180
189
  mdp::CharactersRangeSet sourceMap = mdp::BytesRangeSetToCharactersRangeSet(node->sourceMap, pd.sourceData);
181
- report.warnings.push_back(Warning(ExpectedAPINameMessage,
182
- APINameWarning,
183
- sourceMap));
190
+ out.report.warnings.push_back(Warning(ExpectedAPINameMessage,
191
+ APINameWarning,
192
+ sourceMap));
184
193
  }
185
194
  }
186
195
 
@@ -194,8 +203,7 @@ namespace snowcrash {
194
203
 
195
204
  static void parseMetadata(const MarkdownNodeIterator& node,
196
205
  SectionParserData& pd,
197
- Report& report,
198
- MetadataCollection& out) {
206
+ ParseResult<MetadataCollection>& out) {
199
207
 
200
208
  mdp::ByteBuffer content = node->text;
201
209
  TrimStringEnd(content);
@@ -209,28 +217,34 @@ namespace snowcrash {
209
217
  Metadata metadata;
210
218
 
211
219
  if (CodeBlockUtility::keyValueFromLine(*it, metadata)) {
212
- out.push_back(metadata);
220
+ out.node.push_back(metadata);
221
+
222
+ if (pd.exportSourceMap()) {
223
+ SourceMap<Metadata> metadataSM;
224
+ metadataSM.sourceMap = node->sourceMap;
225
+ out.sourceMap.collection.push_back(metadataSM);
226
+ }
213
227
  }
214
228
  }
215
229
 
216
- if (lines.size() == out.size()) {
230
+ if (lines.size() == out.node.size()) {
217
231
 
218
232
  // Check duplicates
219
233
  std::vector<mdp::ByteBuffer> duplicateKeys;
220
234
 
221
- for (MetadataCollectionIterator it = out.begin();
222
- it != out.end();
235
+ for (MetadataCollectionIterator it = out.node.begin();
236
+ it != out.node.end();
223
237
  ++it) {
224
238
 
225
239
  MetadataCollectionIterator from = it;
226
- if (++from == out.end())
240
+ if (++from == out.node.end())
227
241
  break;
228
242
 
229
243
  MetadataCollectionIterator duplicate = std::find_if(from,
230
- out.end(),
244
+ out.node.end(),
231
245
  std::bind2nd(MatchFirsts<Metadata>(), *it));
232
246
 
233
- if (duplicate != out.end() &&
247
+ if (duplicate != out.node.end() &&
234
248
  std::find(duplicateKeys.begin(), duplicateKeys.end(), it->first) == duplicateKeys.end()) {
235
249
 
236
250
  duplicateKeys.push_back(it->first);
@@ -240,19 +254,19 @@ namespace snowcrash {
240
254
  ss << "duplicate definition of '" << it->first << "'";
241
255
 
242
256
  mdp::CharactersRangeSet sourceMap = mdp::BytesRangeSetToCharactersRangeSet(node->sourceMap, pd.sourceData);
243
- report.warnings.push_back(Warning(ss.str(),
244
- DuplicateWarning,
245
- sourceMap));
257
+ out.report.warnings.push_back(Warning(ss.str(),
258
+ DuplicateWarning,
259
+ sourceMap));
246
260
  }
247
261
  }
248
262
  }
249
- else if (!out.empty()) {
263
+ else if (!out.node.empty()) {
250
264
 
251
265
  // WARN: malformed metadata block
252
266
  mdp::CharactersRangeSet sourceMap = mdp::BytesRangeSetToCharactersRangeSet(node->sourceMap, pd.sourceData);
253
- report.warnings.push_back(Warning("ignoring possible metadata, expected '<key> : <value>', one one per line",
254
- FormattingWarning,
255
- sourceMap));
267
+ out.report.warnings.push_back(Warning("ignoring possible metadata, expected '<key> : <value>', one one per line",
268
+ FormattingWarning,
269
+ sourceMap));
256
270
  }
257
271
  }
258
272
 
@@ -0,0 +1,254 @@
1
+ //
2
+ // BlueprintSourcemap.h
3
+ // snowcrash
4
+ //
5
+ // Created by Pavan Kumar Sunkara on 26/8/14.
6
+ // Copyright (c) 2014 Apiary Inc. All rights reserved.
7
+ //
8
+
9
+ #ifndef SNOWCRASH_BLUEPRINT_SOURCEMAP_H
10
+ #define SNOWCRASH_BLUEPRINT_SOURCEMAP_H
11
+
12
+ #include "Blueprint.h"
13
+ #include "MarkdownParser.h"
14
+
15
+ /**
16
+ * API Blueprint Sourcemap Abstract Syntax Tree
17
+ * ---------------------------------------------
18
+ *
19
+ * Data types in this documents define the API Blueprint Sourcemap AST.
20
+ */
21
+
22
+ #define SOURCE_MAP_COLLECTION(T, TC) template<>\
23
+ struct SourceMap<TC> {\
24
+ Collection<SourceMap<T> >::type collection;\
25
+ };\
26
+
27
+ namespace snowcrash {
28
+
29
+ struct SourceMapBase {
30
+ mdp::BytesRangeSet sourceMap;
31
+ };
32
+
33
+ template<typename T>
34
+ struct SourceMap : public SourceMapBase {
35
+ };
36
+
37
+ /** Source Map of Metadata Collection */
38
+ SOURCE_MAP_COLLECTION(Metadata, MetadataCollection)
39
+
40
+ /** Source Map of Headers */
41
+ // 'Metadata' type is same as 'Header'
42
+
43
+ /** Source Map of Collection of Parameter values */
44
+ SOURCE_MAP_COLLECTION(Value, Values)
45
+
46
+ /** Source Map Structure for Parameter */
47
+ template<>
48
+ struct SourceMap<Parameter> : public SourceMapBase {
49
+
50
+ /** Source Map of Parameter Name */
51
+ SourceMap<Name> name;
52
+
53
+ /** Source Map of Parameter Description */
54
+ SourceMap<Description> description;
55
+
56
+ /** Source Map of Parameter Type */
57
+ SourceMap<Type> type;
58
+
59
+ /** Source Map of Required flag */
60
+ SourceMap<ParameterUse> use;
61
+
62
+ /** Source Map of Default Value, applicable only when `required == false` */
63
+ SourceMap<Value> defaultValue;
64
+
65
+ /** Source Map of Example Value */
66
+ SourceMap<Value> exampleValue;
67
+
68
+ /** Enumeration of possible values */
69
+ SourceMap<Values> values;
70
+ };
71
+
72
+ /** Source Map of Collection of Parameters */
73
+ SOURCE_MAP_COLLECTION(Parameter, Parameters)
74
+
75
+ /**
76
+ * Source Map Structure for Payload
77
+ */
78
+ template<>
79
+ struct SourceMap<Payload> : public SourceMapBase {
80
+
81
+ /** Source Map of a Payload Name */
82
+ SourceMap<Name> name;
83
+
84
+ /** Source Map of Payload Description */
85
+ SourceMap<Description> description;
86
+
87
+ /** Payload-specific Parameters */
88
+ SourceMap<Parameters> parameters;
89
+
90
+ /** Payload-specific Headers */
91
+ SourceMap<Headers> headers;
92
+
93
+ /** Source Map of Body */
94
+ SourceMap<Asset> body;
95
+
96
+ /** Source Map of Schema */
97
+ SourceMap<Asset> schema;
98
+
99
+ /** Source Map of Symbol */
100
+ SourceMap<SymbolName> symbol;
101
+ };
102
+
103
+ /** Source Map of Collection of Requests */
104
+ SOURCE_MAP_COLLECTION(Request, Requests)
105
+
106
+ /** Source Map of Collection of Responses */
107
+ // 'Response' type is same as 'Request'
108
+
109
+ /**
110
+ * Source Map Structure for an HTTP transaction example.
111
+ */
112
+ template<>
113
+ struct SourceMap<TransactionExample> : public SourceMapBase {
114
+
115
+ /** Source Map of an example name */
116
+ SourceMap<Name> name;
117
+
118
+ /** Source Map of Description */
119
+ SourceMap<Description> description;
120
+
121
+ /** Requests */
122
+ SourceMap<Requests> requests;
123
+
124
+ /** Responses */
125
+ SourceMap<Responses> responses;
126
+ };
127
+
128
+ /** Source Map of Collection of Transaction examples */
129
+ SOURCE_MAP_COLLECTION(TransactionExample, TransactionExamples)
130
+
131
+ /**
132
+ * Source Map Structure for Action
133
+ */
134
+ template<>
135
+ struct SourceMap<Action> : public SourceMapBase {
136
+
137
+ /** Source Map of HTTP method */
138
+ SourceMap<HTTPMethod> method;
139
+
140
+ /** Source Map of an Action name */
141
+ SourceMap<Name> name;
142
+
143
+ /** Source Map of Description */
144
+ SourceMap<Description> description;
145
+
146
+ /** Action-specific Parameters */
147
+ SourceMap<Parameters> parameters;
148
+
149
+ /**
150
+ * \brief Action-specific HTTP headers
151
+ *
152
+ * DEPRECATION WARNING:
153
+ * --------------------
154
+ *
155
+ * This AST node is build for deprecated API Blueprint syntax
156
+ * and as such it will be removed in a future version of
157
+ * Snow Crash.
158
+ *
159
+ * Use respective payload's header collection instead.
160
+ */
161
+ DEPRECATED SourceMap<Headers> headers;
162
+
163
+ /** Transactions examples */
164
+ SourceMap<TransactionExamples> examples;
165
+ };
166
+
167
+ /** Source Map of Collection of Actions */
168
+ SOURCE_MAP_COLLECTION(Action, Actions)
169
+
170
+ /**
171
+ * Source Map Structure for API Resource
172
+ */
173
+ template<>
174
+ struct SourceMap<Resource> : public SourceMapBase {
175
+
176
+ /** Source Map of URI template */
177
+ SourceMap<URITemplate> uriTemplate;
178
+
179
+ /** Source Map of a Resource Name */
180
+ SourceMap<Name> name;
181
+
182
+ /** Source Map of Description of the resource */
183
+ SourceMap<Description> description;
184
+
185
+ /** Model representing this Resource */
186
+ SourceMap<ResourceModel> model;
187
+
188
+ /** Parameters */
189
+ SourceMap<Parameters> parameters;
190
+
191
+ /**
192
+ * \brief Resource-specific HTTP Headers
193
+ *
194
+ * DEPRECATION WARNING:
195
+ * --------------------
196
+ *
197
+ * This AST node is build for deprecated API Blueprint syntax
198
+ * and as such it will be removed in a future version of
199
+ * Snow Crash.
200
+ *
201
+ * Use respective payload's header collection instead.
202
+ */
203
+ DEPRECATED SourceMap<Headers> headers;
204
+
205
+ /** A set of Actions specified for this Resource */
206
+ SourceMap<Actions> actions;
207
+ };
208
+
209
+ /** Source Map of Collection of Resources */
210
+ SOURCE_MAP_COLLECTION(Resource, Resources)
211
+
212
+ /**
213
+ * Source Map Structure for Group of API Resources
214
+ */
215
+ template<>
216
+ struct SourceMap<ResourceGroup> : public SourceMapBase {
217
+
218
+ /** Source Map of a Group Name */
219
+ SourceMap<Name> name;
220
+
221
+ /** Source Map of Group description */
222
+ SourceMap<Description> description;
223
+
224
+ /** Resources */
225
+ SourceMap<Resources> resources;
226
+ };
227
+
228
+ /** Source Map of Collection of Resource groups */
229
+ SOURCE_MAP_COLLECTION(ResourceGroup, ResourceGroups)
230
+
231
+ /**
232
+ * \brief API Blueprint Sourcemap AST
233
+ *
234
+ * This is top-level (or root if you prefer) of API Blueprint Sourcemap abstract syntax tree.
235
+ * Start reading a parsed API here.
236
+ */
237
+ template<>
238
+ struct SourceMap<Blueprint> : public SourceMapBase {
239
+
240
+ /** Source Map of API Blueprint metadata */
241
+ SourceMap<MetadataCollection> metadata;
242
+
243
+ /** Source Map of the API Name */
244
+ SourceMap<Name> name;
245
+
246
+ /** Source Map of an API Overview description */
247
+ SourceMap<Description> description;
248
+
249
+ /** The set of API Resource Groups */
250
+ SourceMap<ResourceGroups> resourceGroups;
251
+ };
252
+ }
253
+
254
+ #endif