redsnow 0.2.0 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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