@@ -41,41 +41,6 @@ static kindDefinition OpenAPIKinds [] = {
41
41
{ true, 's' , "server" , "servers (or hosts in swagger)" },
42
42
};
43
43
44
- #define KEY_UNKNOWN KEYWORD_NONE
45
- enum openapiKeys {
46
- KEY_PATHS ,
47
- KEY_COMPONENTS ,
48
- KEY_SCHEMAS ,
49
- KEY_PARAMETERS ,
50
- KEY_RESPONSES ,
51
- KEY_DEFINITIONS ,
52
- KEY_INFO ,
53
- KEY_TITLE ,
54
- KEY_SERVERS ,
55
- KEY_URL ,
56
- KEY_HOST ,
57
- };
58
-
59
- static const keywordTable OpenAPIKeywordTable [] = {
60
- { "paths" , KEY_PATHS },
61
- { "components" , KEY_COMPONENTS },
62
- { "schemas" , KEY_SCHEMAS },
63
- { "parameters" , KEY_PARAMETERS },
64
- { "responses" , KEY_RESPONSES },
65
- { "definitions" , KEY_DEFINITIONS },
66
- { "info" , KEY_INFO },
67
- { "title" , KEY_TITLE },
68
- { "servers" , KEY_SERVERS },
69
- { "url" , KEY_URL },
70
- { "host" , KEY_HOST },
71
- };
72
-
73
- struct yamlBlockTypeStack {
74
- yaml_token_type_t type ;
75
- enum openapiKeys key ;
76
- struct yamlBlockTypeStack * next ;
77
- };
78
-
79
44
/* - name: "THE NAME" */
80
45
enum openapiPlayDetectingState {
81
46
DSTAT_LAST_KEY ,
@@ -86,238 +51,37 @@ enum openapiPlayDetectingState {
86
51
87
52
struct sOpenAPISubparser {
88
53
yamlSubparser yaml ;
89
- struct yamlBlockTypeStack * type_stack ;
90
54
enum openapiPlayDetectingState play_detection_state ;
91
55
};
92
56
93
- static void pushBlockType (struct sOpenAPISubparser * openapi , yaml_token_type_t t )
94
- {
95
- struct yamlBlockTypeStack * s ;
96
-
97
- s = xMalloc (1 , struct yamlBlockTypeStack );
98
-
99
- s -> next = openapi -> type_stack ;
100
- openapi -> type_stack = s ;
101
-
102
- s -> type = t ;
103
- s -> key = KEY_UNKNOWN ;
104
- }
105
-
106
- static void popBlockType (struct sOpenAPISubparser * openapi )
107
- {
108
- struct yamlBlockTypeStack * s ;
109
-
110
- s = openapi -> type_stack ;
111
- openapi -> type_stack = s -> next ;
112
-
113
- s -> next = NULL ;
114
-
115
- eFree (s );
116
- }
117
-
118
- static void popAllBlockType (struct sOpenAPISubparser * openapi )
119
- {
120
- while (openapi -> type_stack )
121
- popBlockType (openapi );
122
- }
123
-
124
- static bool stateStackMatch (struct yamlBlockTypeStack * stack ,
125
- const enum openapiKeys * expectation ,
126
- unsigned int length )
127
- {
128
- if (length == 0 )
129
- {
130
- if (stack == NULL )
131
- return true;
132
- else
133
- return false;
134
- }
135
-
136
- if (stack == NULL )
137
- return false;
138
-
139
- if (stack -> key == expectation [0 ])
140
- return stateStackMatch (stack -> next , expectation + 1 , length - 1 );
141
- else
142
- return false;
143
- }
144
-
145
- static enum openapiKeys parseKey (yaml_token_t * token )
146
- {
147
- static langType langType = LANG_IGNORE ;
148
- if (langType == LANG_IGNORE )
149
- langType = getInputLanguage ();
150
-
151
- return lookupKeyword ((char * )token -> data .scalar .value , langType );
152
- }
153
-
154
- #ifdef DO_TRACING
155
- static void printStack (struct yamlBlockTypeStack * stack )
156
- {
157
- if (!stack )
158
- {
159
- TRACE_PRINT_NEWLINE ();
160
- return ;
161
- }
162
-
163
- tracePrintFmt ("[%d] - " , stack -> key );
164
- printStack (stack -> next );
165
- }
166
- #endif
167
-
168
- struct tagSource {
169
- openapiKind kind ;
170
- const enum openapiKeys * keys ;
171
- size_t countKeys ;
172
- };
173
-
174
- static const enum openapiKeys pathKeys [] = {
175
- KEY_UNKNOWN ,
176
- KEY_PATHS ,
177
- };
178
-
179
- static const enum openapiKeys responses3Keys [] = {
180
- KEY_UNKNOWN ,
181
- KEY_RESPONSES ,
182
- KEY_COMPONENTS ,
183
- };
184
-
185
- static const enum openapiKeys responses2Keys [] = {
186
- KEY_UNKNOWN ,
187
- KEY_RESPONSES ,
188
- };
189
-
190
- static const enum openapiKeys parameters3Keys [] = {
191
- KEY_UNKNOWN ,
192
- KEY_PARAMETERS ,
193
- KEY_COMPONENTS ,
194
- };
195
-
196
- static const enum openapiKeys parameters2Keys [] = {
197
- KEY_UNKNOWN ,
198
- KEY_PARAMETERS ,
57
+ static tagYpathTable ypathTables [] = {
58
+ { "paths/*" ,
59
+ DSTAT_LAST_KEY , KIND_PATH , },
60
+ { "components/responses/*" ,
61
+ DSTAT_LAST_KEY , KIND_RESPONSE , },
62
+ { "responses/*" ,
63
+ DSTAT_LAST_KEY , KIND_RESPONSE , },
64
+ { "components/parameters/*" ,
65
+ DSTAT_LAST_KEY , KIND_PARAMETER , },
66
+ { "parameters/*" ,
67
+ DSTAT_LAST_KEY , KIND_PARAMETER , },
68
+ { "components/schemas/*" ,
69
+ DSTAT_LAST_KEY , KIND_SCHEMA , },
70
+ { "definitions/*" ,
71
+ DSTAT_LAST_KEY , KIND_SCHEMA , },
72
+ { "info/title" ,
73
+ DSTAT_LAST_VALUE , KIND_TITLE , },
74
+ { "servers/*/url" ,
75
+ DSTAT_LAST_VALUE , KIND_SERVER , },
76
+ { "host" ,
77
+ DSTAT_LAST_VALUE , KIND_SERVER , },
199
78
};
200
79
201
- static const enum openapiKeys schemas3Keys [] = {
202
- KEY_UNKNOWN ,
203
- KEY_SCHEMAS ,
204
- KEY_COMPONENTS ,
205
- };
206
-
207
- static const enum openapiKeys definitions2Keys [] = {
208
- KEY_UNKNOWN ,
209
- KEY_DEFINITIONS ,
210
- };
211
-
212
- static const enum openapiKeys title3Keys [] = {
213
- KEY_TITLE ,
214
- KEY_INFO ,
215
- };
216
-
217
- static const enum openapiKeys server3Keys [] = {
218
- KEY_URL ,
219
- KEY_UNKNOWN ,
220
- KEY_SERVERS ,
221
- };
222
-
223
- static const enum openapiKeys host2Keys [] = {
224
- KEY_HOST ,
225
- };
226
-
227
- static const struct tagSource tagSources [] = {
228
- {
229
- KIND_PATH ,
230
- pathKeys ,
231
- ARRAY_SIZE (pathKeys ),
232
- },
233
- {
234
- KIND_RESPONSE ,
235
- responses3Keys ,
236
- ARRAY_SIZE (responses3Keys ),
237
- },
238
- {
239
- KIND_RESPONSE ,
240
- responses2Keys ,
241
- ARRAY_SIZE (responses2Keys ),
242
- },
243
- {
244
- KIND_PARAMETER ,
245
- parameters3Keys ,
246
- ARRAY_SIZE (parameters3Keys ),
247
- },
248
- {
249
- KIND_PARAMETER ,
250
- parameters2Keys ,
251
- ARRAY_SIZE (parameters2Keys ),
252
- },
253
- {
254
- KIND_SCHEMA ,
255
- schemas3Keys ,
256
- ARRAY_SIZE (schemas3Keys ),
257
- },
258
- {
259
- KIND_SCHEMA ,
260
- definitions2Keys ,
261
- ARRAY_SIZE (definitions2Keys ),
262
- },
263
- };
264
-
265
- static const struct tagSource tagValueSources [] = {
266
- {
267
- KIND_TITLE ,
268
- title3Keys ,
269
- ARRAY_SIZE (title3Keys ),
270
- },
271
- {
272
- KIND_SERVER ,
273
- server3Keys ,
274
- ARRAY_SIZE (server3Keys ),
275
- },
276
- {
277
- KIND_SERVER ,
278
- host2Keys ,
279
- ARRAY_SIZE (host2Keys ),
280
- }
281
- };
282
-
283
- static void handleToken (struct sOpenAPISubparser * openapi , yaml_token_t * token ,
284
- const struct tagSource * tss , size_t ts_count )
285
- {
286
- for (int i = 0 ; i < ts_count ; i ++ )
287
- {
288
- const struct tagSource * ts = & tss [i ];
289
-
290
- if (stateStackMatch (openapi -> type_stack ,
291
- ts -> keys , ts -> countKeys ))
292
- {
293
-
294
- tagEntryInfo tag ;
295
- initTagEntry (& tag , (char * )token -> data .scalar .value , ts -> kind );
296
- attachYamlPosition (& tag , token , false);
297
-
298
- makeTagEntry (& tag );
299
- break ;
300
- }
301
- }
302
- }
303
-
304
- static void handleKey (struct sOpenAPISubparser * openapi ,
305
- yaml_token_t * token )
306
- {
307
- handleToken (openapi , token , tagSources , ARRAY_SIZE (tagSources ));
308
- }
309
-
310
- static void handleValue (struct sOpenAPISubparser * openapi ,
311
- yaml_token_t * token )
312
- {
313
- handleToken (openapi , token , tagValueSources , ARRAY_SIZE (tagValueSources ));
314
- }
315
-
316
80
static void openapiPlayStateMachine (struct sOpenAPISubparser * openapi ,
317
81
yaml_token_t * token )
318
82
{
319
83
#ifdef DO_TRACING
320
- printStack ( openapi -> type_stack );
84
+ ypathPrintTypeStack ( YAML ( openapi ) );
321
85
#endif
322
86
323
87
switch (token -> type )
@@ -329,17 +93,14 @@ static void openapiPlayStateMachine (struct sOpenAPISubparser *openapi,
329
93
switch (openapi -> play_detection_state )
330
94
{
331
95
case DSTAT_LAST_KEY :
332
- TRACE_PRINT (" key: %s" , (char * )token -> data .scalar .value );
333
- if (openapi -> type_stack )
334
- {
335
- openapi -> type_stack -> key = parseKey (token );
336
- handleKey (openapi , token );
337
- }
338
- break ;
96
+ ypathFillKeywordOfTokenMaybe (YAML (openapi ), token , getInputLanguage ());
97
+ /* FALL THROUGH */
339
98
case DSTAT_LAST_VALUE :
340
- TRACE_PRINT (" value: %s" , (char * )token -> data .scalar .value );
341
- if (openapi -> type_stack )
342
- handleValue (openapi , token );
99
+ TRACE_PRINT ("token-callback: %s: %s" ,
100
+ (openapi -> play_detection_state == DSTAT_LAST_KEY )? "key" : "value" ,
101
+ (char * )token -> data .scalar .value );
102
+ ypathHandleToken (YAML (openapi ), token , openapi -> play_detection_state ,
103
+ ypathTables , ARRAY_SIZE (ypathTables ));
343
104
break ;
344
105
default :
345
106
break ;
@@ -362,32 +123,43 @@ static void newTokenCallback (yamlSubparser *s, yaml_token_t *token)
362
123
{
363
124
if (token -> type == YAML_BLOCK_SEQUENCE_START_TOKEN
364
125
|| token -> type == YAML_BLOCK_MAPPING_START_TOKEN )
365
- pushBlockType (( struct sOpenAPISubparser * ) s , token -> type );
126
+ ypathPushType ( s , token );
366
127
367
128
openapiPlayStateMachine ((struct sOpenAPISubparser * )s , token );
368
129
369
130
if (token -> type == YAML_BLOCK_END_TOKEN )
370
- popBlockType (( struct sOpenAPISubparser * ) s );
131
+ ypathPopType ( s );
371
132
else if (token -> type == YAML_STREAM_END_TOKEN )
372
- popAllBlockType (( struct sOpenAPISubparser * ) s );
133
+ ypathPopAllTypes ( s );
373
134
}
374
135
375
136
static void inputStart (subparser * s )
376
137
{
377
138
((struct sOpenAPISubparser * )s )-> play_detection_state = DSTAT_INITIAL ;
378
- ((struct sOpenAPISubparser * )s )-> type_stack = NULL ;
139
+ ((yamlSubparser * )s )-> ypathTypeStack = NULL ;
379
140
}
380
141
381
142
static void inputEnd (subparser * s )
382
143
{
383
- Assert (((struct sOpenAPISubparser * )s )-> type_stack == NULL );
144
+ Assert (((yamlSubparser * )s )-> ypathTypeStack == NULL );
384
145
}
385
146
386
147
static void findOpenAPITags (void )
387
148
{
388
149
scheduleRunningBaseparser (0 );
389
150
}
390
151
152
+ static void initialize (langType language )
153
+ {
154
+ ypathCompileTables (language , ypathTables , ARRAY_SIZE (ypathTables ), 0 );
155
+ }
156
+
157
+ static void finalize (langType language , bool initialized )
158
+ {
159
+ if (initialized )
160
+ ypathCompiledCodeDelete (ypathTables , ARRAY_SIZE (ypathTables ));
161
+ }
162
+
391
163
extern parserDefinition * OpenAPIParser (void )
392
164
{
393
165
static const char * const patterns [] = { "openapi.yaml" , NULL };
@@ -412,11 +184,10 @@ extern parserDefinition* OpenAPIParser (void)
412
184
def -> dependencies = dependencies ;
413
185
def -> dependencyCount = ARRAY_SIZE (dependencies );
414
186
415
- def -> keywordTable = OpenAPIKeywordTable ;
416
- def -> keywordCount = ARRAY_SIZE (OpenAPIKeywordTable );
417
-
418
187
def -> kindTable = OpenAPIKinds ;
419
188
def -> kindCount = ARRAY_SIZE (OpenAPIKinds );
420
189
def -> parser = findOpenAPITags ;
190
+ def -> initialize = initialize ;
191
+ def -> finalize = finalize ;
421
192
return def ;
422
193
}
0 commit comments