Skip to content

Commit d6d54e5

Browse files
fix#375-Added ValidateSchemaRequiredFields and ValidateSchemaDiscriminator
1 parent 24be792 commit d6d54e5

File tree

4 files changed

+98
-4
lines changed

4 files changed

+98
-4
lines changed

src/Microsoft.OpenApi/Properties/SRResource.Designer.cs

Lines changed: 30 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/Microsoft.OpenApi/Properties/SRResource.resx

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -216,6 +216,15 @@
216216
<data name="Validation_RuleAddTwice" xml:space="preserve">
217217
<value>The same rule cannot be in the same rule set twice.</value>
218218
</data>
219+
<data name="Validation_SchemaMustContainPropertySpecifiedInTheDiscriminator" xml:space="preserve">
220+
<value>Schema {0} must contain property specified in the discriminator {1}.</value>
221+
</data>
222+
<data name="Validation_SchemaMustContainPropertySpecifiedInTheRequiredField" xml:space="preserve">
223+
<value>Schema {0} must contain property specified in the required field {0}.</value>
224+
</data>
225+
<data name="Validation_SchemaRequiredFieldListMustContainThePropertySpecifiedInTheDiscriminator" xml:space="preserve">
226+
<value>Schema {0} must contain property specified in the discriminator {1} in the required field list.</value>
227+
</data>
219228
<data name="Validation_StringMustBeEmailAddress" xml:space="preserve">
220229
<value>The string '{0}' MUST be in the format of an email address.</value>
221230
</data>

src/Microsoft.OpenApi/Services/OpenApiWalker.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -772,7 +772,7 @@ internal void Walk(OpenApiSchema schema)
772772

773773
if (schema.AnyOf != null)
774774
{
775-
Walk("anyOf", () => Walk(schema.AllOf));
775+
Walk("anyOf", () => Walk(schema.AnyOf));
776776
}
777777

778778
if (schema.Properties != null) {
@@ -883,7 +883,7 @@ internal void Walk(IList<OpenApiSchema> schemas)
883883
}
884884
}
885885
}
886-
886+
887887
/// <summary>
888888
/// Visits <see cref="OpenApiOAuthFlows"/> and child objects
889889
/// </summary>

src/Microsoft.OpenApi/Validations/Rules/OpenApiSchemaRules.cs

Lines changed: 57 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,62 @@ public static class OpenApiSchemaRules
5757
context.Exit();
5858
});
5959

60+
/// <summary>
61+
/// Validates Schema Required Fields
62+
/// </summary>
63+
public static ValidationRule<OpenApiSchema> ValidateSchemaRequiredFields =>
64+
new ValidationRule<OpenApiSchema>(
65+
(context, schema) =>
66+
{
67+
// discriminator
68+
context.Enter("required");
69+
70+
if (schema.Reference != null)
71+
{
72+
foreach (var requiredField in schema.Required)
73+
{
74+
if (!schema.Properties.ContainsKey(requiredField))
75+
{
76+
context.CreateError(nameof(ValidateSchemaDiscriminator),
77+
string.Format(SRResource.Validation_SchemaMustContainPropertySpecifiedInTheRequiredField,
78+
requiredField));
79+
}
80+
}
81+
}
82+
83+
context.Exit();
84+
});
85+
86+
/// <summary>
87+
/// Validates Schema Discriminator
88+
/// </summary>
89+
public static ValidationRule<OpenApiSchema> ValidateSchemaDiscriminator =>
90+
new ValidationRule<OpenApiSchema>(
91+
(context, schema) =>
92+
{
93+
// discriminator
94+
context.Enter("discriminator");
95+
96+
if(schema.Reference != null && schema.Discriminator != null)
97+
{
98+
if (!schema.Properties.ContainsKey(schema.Discriminator.PropertyName))
99+
{
100+
context.CreateError(nameof(ValidateSchemaDiscriminator),
101+
string.Format(SRResource.Validation_SchemaMustContainPropertySpecifiedInTheDiscriminator,
102+
schema.Reference.Id, schema.Discriminator.PropertyName));
103+
}
104+
105+
if (!schema.Required.Contains(schema.Discriminator?.PropertyName))
106+
{
107+
context.CreateError(nameof(ValidateSchemaDiscriminator),
108+
string.Format(SRResource.Validation_SchemaRequiredFieldListMustContainThePropertySpecifiedInTheDiscriminator,
109+
schema.Reference.Id, schema.Discriminator.PropertyName));
110+
}
111+
}
112+
113+
context.Exit();
114+
});
115+
60116
/// <summary>
61117
/// Validates OneOf Discriminator
62118
/// </summary>
@@ -97,7 +153,7 @@ public static class OpenApiSchemaRules
97153

98154
// add more rule.
99155

100-
156+
101157
/// <summary>
102158
/// Checks if the schemas in the list contain a property with the property name specified by the discriminator.
103159
/// </summary>

0 commit comments

Comments
 (0)