1
1
// Copyright (c) Microsoft Corporation. All rights reserved.
2
2
// Licensed under the MIT license.
3
3
4
+ using System ;
4
5
using System . Collections . Generic ;
5
6
using Microsoft . OpenApi . Models ;
7
+ using Microsoft . OpenApi . Interfaces ;
6
8
7
9
namespace Microsoft . OpenApi . Services
8
10
{
@@ -22,81 +24,134 @@ public OpenApiWalker(OpenApiVisitorBase visitor)
22
24
}
23
25
24
26
/// <summary>
25
- /// Walks through the <see cref="OpenApiDocument"/> and validates each element.
27
+ /// Walks through the <see cref="OpenApiDocument"/> and visits each element.
26
28
/// </summary>
27
- /// <param name="doc"></param>
29
+ /// <param name="doc">OpenApiDocument to be walked </param>
28
30
public void Walk ( OpenApiDocument doc )
29
31
{
30
32
_visitor . Visit ( doc ) ;
31
33
_visitor . Visit ( doc . Info ) ;
32
34
_visitor . Visit ( doc . Servers ) ;
33
35
36
+ // Visit Servers
34
37
if ( doc . Servers != null )
35
38
{
36
39
foreach ( var server in doc . Servers )
37
40
{
38
- _visitor . Visit ( server ) ;
39
- foreach ( var variable in server . Variables . Values )
40
- {
41
- _visitor . Visit ( variable ) ;
42
- }
41
+ WalkServer ( server ) ;
43
42
}
44
43
}
45
44
45
+ // Visit Paths
46
46
_visitor . Visit ( doc . Paths ) ;
47
47
foreach ( var pathItem in doc . Paths . Values )
48
48
{
49
- _visitor . Visit ( pathItem ) ;
50
- _visitor . Visit ( pathItem . Operations ) ;
51
- foreach ( var operation in pathItem . Operations . Values )
49
+ WalkPathItem ( pathItem ) ;
50
+ }
51
+
52
+ _visitor . Visit ( doc . Components ) ;
53
+
54
+ _visitor . Visit ( doc . ExternalDocs ) ;
55
+
56
+ _visitor . Visit ( doc . Tags ) ;
57
+
58
+ foreach ( var tag in doc . Tags )
59
+ {
60
+ WalkTag ( tag ) ;
61
+ }
62
+
63
+ _visitor . Visit ( doc as IOpenApiExtensible ) ;
64
+
65
+ }
66
+
67
+ private void WalkTag ( OpenApiTag tag )
68
+ {
69
+ _visitor . Visit ( tag ) ;
70
+ _visitor . Visit ( tag . ExternalDocs ) ;
71
+ _visitor . Visit ( tag as IOpenApiExtensible ) ;
72
+ }
73
+
74
+ private void WalkServer ( OpenApiServer server )
75
+ {
76
+ _visitor . Visit ( server ) ;
77
+ foreach ( var variable in server . Variables . Values )
78
+ {
79
+ _visitor . Visit ( variable ) ;
80
+ }
81
+ _visitor . Visit ( server as IOpenApiExtensible ) ;
82
+ }
83
+
84
+ private void WalkPathItem ( OpenApiPathItem pathItem )
85
+ {
86
+ _visitor . Visit ( pathItem ) ;
87
+ _visitor . Visit ( pathItem . Operations ) ;
88
+ foreach ( var operation in pathItem . Operations . Values )
89
+ {
90
+ WalkOperation ( operation ) ;
91
+ }
92
+ _visitor . Visit ( pathItem as IOpenApiExtensible ) ;
93
+ }
94
+
95
+ private void WalkOperation ( OpenApiOperation operation )
96
+ {
97
+ _visitor . Visit ( operation ) ;
98
+ if ( operation . Parameters != null )
99
+ {
100
+ _visitor . Visit ( operation . Parameters ) ;
101
+ foreach ( var parameter in operation . Parameters )
52
102
{
53
- _visitor . Visit ( operation ) ;
54
- if ( operation . Parameters != null )
55
- {
56
- _visitor . Visit ( operation . Parameters ) ;
57
- foreach ( var parameter in operation . Parameters )
58
- {
59
- _visitor . Visit ( parameter ) ;
60
- }
61
- }
62
-
63
- if ( operation . RequestBody != null )
64
- {
65
- _visitor . Visit ( operation . RequestBody ) ;
66
-
67
- if ( operation . RequestBody . Content != null )
68
- {
69
- WalkContent ( operation . RequestBody . Content ) ;
70
- }
71
- }
72
-
73
- if ( operation . Responses != null )
74
- {
75
- _visitor . Visit ( operation . Responses ) ;
76
-
77
- foreach ( var response in operation . Responses . Values )
78
- {
79
- _visitor . Visit ( response ) ;
80
- WalkContent ( response . Content ) ;
81
-
82
- if ( response . Links != null )
83
- {
84
- _visitor . Visit ( response . Links ) ;
85
- foreach ( var link in response . Links . Values )
86
- {
87
- _visitor . Visit ( link ) ;
88
- }
89
- }
90
- }
91
- }
103
+ _visitor . Visit ( parameter ) ;
92
104
}
93
105
}
106
+
107
+ WalkRequestBody ( operation . RequestBody ) ;
108
+
109
+ if ( operation . Responses != null )
110
+ {
111
+ _visitor . Visit ( operation . Responses ) ;
112
+
113
+ foreach ( var response in operation . Responses . Values )
114
+ {
115
+ WalkResponse ( response ) ;
116
+ }
117
+
118
+ _visitor . Visit ( operation . Responses as IOpenApiExtensible ) ;
119
+ }
94
120
}
95
121
96
- /// <summary>
97
- /// Walks through each media type in content and validates.
98
- /// </summary>
99
- private void WalkContent ( IDictionary < string , OpenApiMediaType > content )
122
+ private void WalkResponse ( OpenApiResponse response )
123
+ {
124
+ _visitor . Visit ( response ) ;
125
+ WalkContentMap ( response . Content ) ;
126
+
127
+ if ( response . Links != null )
128
+ {
129
+ _visitor . Visit ( response . Links ) ;
130
+ foreach ( var link in response . Links . Values )
131
+ {
132
+ _visitor . Visit ( link ) ;
133
+ }
134
+ }
135
+
136
+ _visitor . Visit ( response as IOpenApiExtensible ) ;
137
+ }
138
+
139
+ private void WalkRequestBody ( OpenApiRequestBody requestBody )
140
+ {
141
+ if ( requestBody != null )
142
+ {
143
+ _visitor . Visit ( requestBody ) ;
144
+
145
+ if ( requestBody . Content != null )
146
+ {
147
+ WalkContentMap ( requestBody . Content ) ;
148
+ }
149
+
150
+ _visitor . Visit ( requestBody as IOpenApiExtensible ) ;
151
+ }
152
+ }
153
+
154
+ private void WalkContentMap ( IDictionary < string , OpenApiMediaType > content )
100
155
{
101
156
if ( content == null )
102
157
{
0 commit comments