Skip to content

Commit 60a26b2

Browse files
committed
Merged validation code
2 parents 7ca70f2 + 909a0d7 commit 60a26b2

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

46 files changed

+2261
-167
lines changed

src/Microsoft.OpenApi.Readers/OpenApiStreamReader.cs

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,11 @@
33

44
using System.IO;
55
using System.Linq;
6+
using Microsoft.OpenApi.Extensions;
67
using Microsoft.OpenApi.Models;
78
using Microsoft.OpenApi.Readers.Interface;
9+
using Microsoft.OpenApi.Services;
10+
using Microsoft.OpenApi.Validations;
811
using SharpYaml;
912
using SharpYaml.Serialization;
1013

@@ -38,6 +41,7 @@ public OpenApiDocument Read(Stream input, out OpenApiDiagnostic diagnostic)
3841
YamlDocument yamlDocument;
3942
diagnostic = new OpenApiDiagnostic();
4043

44+
// Parse the YAML/JSON
4145
try
4246
{
4347
yamlDocument = LoadYamlDocument(input);
@@ -52,7 +56,18 @@ public OpenApiDocument Read(Stream input, out OpenApiDiagnostic diagnostic)
5256
{
5357
ExtensionParsers = _settings.ExtensionParsers
5458
};
55-
return context.Parse(yamlDocument, diagnostic);
59+
60+
// Parse the OpenAPI Document
61+
var document = context.Parse(yamlDocument, diagnostic);
62+
63+
// Validate the document
64+
var errors = document.Validate();
65+
foreach (var item in errors)
66+
{
67+
diagnostic.Errors.Add(new OpenApiError(item.ErrorPath, item.ErrorMessage));
68+
}
69+
70+
return document;
5671
}
5772

5873
/// <summary>

src/Microsoft.OpenApi.Readers/V2/OpenApiDocumentDeserializer.cs

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -125,11 +125,8 @@ public static OpenApiDocument LoadOpenApi(RootNode rootNode)
125125

126126
var openApiNode = rootNode.GetMap();
127127

128-
var required = new List<string> {"info", "swagger", "paths"};
128+
ParseMap(openApiNode, openApidoc, _openApiFixedFields, _openApiPatternFields);
129129

130-
ParseMap(openApiNode, openApidoc, _openApiFixedFields, _openApiPatternFields, required);
131-
132-
ReportMissing(openApiNode, required);
133130

134131
// Post Process OpenApi Object
135132
if (openApidoc.Servers == null)

src/Microsoft.OpenApi.Readers/V2/OpenApiInfoDeserializer.cs

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -65,11 +65,8 @@ public static OpenApiInfo LoadInfo(ParseNode node)
6565
var mapNode = node.CheckMapNode("Info");
6666

6767
var info = new OpenApiInfo();
68-
var required = new List<string> {"title", "version"};
6968

70-
ParseMap(mapNode, info, _infoFixedFields, _infoPatternFields, required);
71-
72-
ReportMissing(node, required);
69+
ParseMap(mapNode, info, _infoFixedFields, _infoPatternFields);
7370

7471
return info;
7572
}

src/Microsoft.OpenApi.Readers/V2/OpenApiV2Deserializer.cs

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -32,17 +32,6 @@ private static void ParseMap<T>(
3232
}
3333
}
3434

35-
private static void ReportMissing(ParseNode node, IList<string> required)
36-
{
37-
foreach (var error in required.Select(
38-
r => new OpenApiError(
39-
node.Context.GetLocation(),
40-
$"{r} is a required property"))
41-
.ToList())
42-
{
43-
node.Diagnostic.Errors.Add(error);
44-
}
45-
}
4635

4736
private static string LoadString(ParseNode node)
4837
{

src/Microsoft.OpenApi.Readers/V3/OpenApiDocumentDeserializer.cs

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -44,11 +44,7 @@ public static OpenApiDocument LoadOpenApi(RootNode rootNode)
4444

4545
var openApiNode = rootNode.GetMap();
4646

47-
var required = new List<string> {"info", "openapi", "paths"};
48-
49-
ParseMap(openApiNode, openApidoc, _openApiFixedFields, _openApiPatternFields, required);
50-
51-
ReportMissing(openApiNode, required);
47+
ParseMap(openApiNode, openApidoc, _openApiFixedFields, _openApiPatternFields);
5248

5349
return openApidoc;
5450
}

src/Microsoft.OpenApi.Readers/V3/OpenApiInfoDeserializer.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ public static OpenApiInfo LoadInfo(ParseNode node)
6767
var info = new OpenApiInfo();
6868
var required = new List<string> {"title", "version"};
6969

70-
ParseMap(mapNode, info, InfoFixedFields, InfoPatternFields, required);
70+
ParseMap(mapNode, info, InfoFixedFields, InfoPatternFields);
7171

7272
return info;
7373
}

src/Microsoft.OpenApi.Readers/V3/OpenApiParameterDeserializer.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,7 @@ public static OpenApiParameter LoadParameter(ParseNode node)
117117
var parameter = new OpenApiParameter();
118118
var required = new List<string> {"name", "in"};
119119

120-
ParseMap(mapNode, parameter, _parameterFixedFields, _parameterPatternFields, required);
120+
ParseMap(mapNode, parameter, _parameterFixedFields, _parameterPatternFields);
121121

122122
return parameter;
123123
}

src/Microsoft.OpenApi.Readers/V3/OpenApiResponseDeserializer.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ public static OpenApiResponse LoadResponse(ParseNode node)
6060

6161
var requiredFields = new List<string> {"description"};
6262
var response = new OpenApiResponse();
63-
ParseMap(mapNode, response, _responseFixedFields, _responsePatternFields, requiredFields);
63+
ParseMap(mapNode, response, _responseFixedFields, _responsePatternFields);
6464

6565
return response;
6666
}

src/Microsoft.OpenApi.Readers/V3/OpenApiV3Deserializer.cs

Lines changed: 1 addition & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,7 @@ private static void ParseMap<T>(
1919
MapNode mapNode,
2020
T domainObject,
2121
FixedFieldMap<T> fixedFieldMap,
22-
PatternFieldMap<T> patternFieldMap,
23-
List<string> requiredFields = null)
22+
PatternFieldMap<T> patternFieldMap)
2423
{
2524
if (mapNode == null)
2625
{
@@ -30,10 +29,8 @@ private static void ParseMap<T>(
3029
foreach (var propertyNode in mapNode)
3130
{
3231
propertyNode.ParseField(domainObject, fixedFieldMap, patternFieldMap);
33-
requiredFields?.Remove(propertyNode.Name);
3432
}
3533

36-
ReportMissing(mapNode, requiredFields);
3734
}
3835

3936
private static RuntimeExpression LoadRuntimeExpression(ParseNode node)
@@ -60,22 +57,7 @@ private static RuntimeExpressionAnyWrapper LoadRuntimeExpressionAnyWrapper(Parse
6057
};
6158
}
6259

63-
private static void ReportMissing(ParseNode node, IList<string> required)
64-
{
65-
if (required == null || !required.Any())
66-
{
67-
return;
68-
}
6960

70-
foreach (var error in required.Select(
71-
r => new OpenApiError(
72-
node.Context.GetLocation(),
73-
$"{r} is a required property"))
74-
.ToList())
75-
{
76-
node.Diagnostic.Errors.Add(error);
77-
}
78-
}
7961

8062
private static string LoadString(ParseNode node)
8163
{
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
// Copyright (c) Microsoft Corporation. All rights reserved.
2+
// Licensed under the MIT license.
3+
4+
using System;
5+
using System.Collections.Generic;
6+
using Microsoft.OpenApi.Interfaces;
7+
using Microsoft.OpenApi.Models;
8+
using Microsoft.OpenApi.Services;
9+
using Microsoft.OpenApi.Validations;
10+
11+
namespace Microsoft.OpenApi.Extensions
12+
{
13+
/// <summary>
14+
/// Extension methods that apply across all OpenAPIElements
15+
/// </summary>
16+
public static class OpenApiElementExtensions
17+
{
18+
/// <summary>
19+
/// Validate element and all child elements
20+
/// </summary>
21+
/// <typeparam name="T"></typeparam>
22+
/// <param name="element"></param>
23+
/// <returns>An IEnumerable of errors. This function will never return null.</returns>
24+
public static IEnumerable<ValidationError> Validate(this IOpenApiElement element) {
25+
var validator = new OpenApiValidator();
26+
var walker = new OpenApiWalker(validator);
27+
walker.Walk(element);
28+
return validator.Errors;
29+
}
30+
}
31+
}

0 commit comments

Comments
 (0)