@@ -68,14 +68,13 @@ public static class OpenApiSchemaRules
68
68
69
69
if ( schema . Reference != null && schema . Discriminator != null )
70
70
{
71
- var discriminator = schema . Discriminator ? . PropertyName ;
72
- var schemaReferenceId = schema . Reference . Id ;
71
+ var discriminatorName = schema . Discriminator ? . PropertyName ;
73
72
74
- if ( ! ValidateChildSchemaAgainstDiscriminator ( schema , discriminator , schemaReferenceId , context ) )
73
+ if ( ! ValidateChildSchemaAgainstDiscriminator ( schema , discriminatorName ) )
75
74
{
76
75
context . CreateError ( nameof ( ValidateSchemaDiscriminator ) ,
77
76
string . Format ( SRResource . Validation_SchemaRequiredFieldListMustContainThePropertySpecifiedInTheDiscriminator ,
78
- schemaReferenceId , discriminator ) ) ;
77
+ schema . Reference . Id , discriminatorName ) ) ;
79
78
}
80
79
}
81
80
@@ -86,51 +85,52 @@ public static class OpenApiSchemaRules
86
85
/// Validates the property name in the discriminator against the ones present in the children schema
87
86
/// </summary>
88
87
/// <param name="schema">The parent schema.</param>
89
- /// <param name="discriminator ">Adds support for polymorphism. The discriminator is an object name that is used to differentiate
88
+ /// <param name="discriminatorName ">Adds support for polymorphism. The discriminator is an object name that is used to differentiate
90
89
/// between other schemas which may satisfy the payload description.</param>
91
- /// <param name="schemaReferenceId"></param>
92
- /// <param name="context">A validation context.</param>
93
- public static bool ValidateChildSchemaAgainstDiscriminator ( OpenApiSchema schema , string discriminator , string schemaReferenceId , IValidationContext context )
90
+ public static bool ValidateChildSchemaAgainstDiscriminator ( OpenApiSchema schema , string discriminatorName )
94
91
{
95
92
bool containsDiscriminator = false ;
96
93
97
- if ( ! schema . Required . Contains ( discriminator ) )
94
+ if ( ! schema . Required ? . Contains ( discriminatorName ) ?? false )
98
95
{
99
96
// recursively check nested schema.OneOf, schema.AnyOf or schema.AllOf and their required fields for the discriminator
100
97
if ( schema . OneOf . Count != 0 )
101
98
{
102
- return TraverseSchemaElements ( discriminator , schema . OneOf , schemaReferenceId , context , containsDiscriminator ) ;
99
+ return TraverseSchemaElements ( discriminatorName , schema . OneOf , ref containsDiscriminator ) ;
103
100
}
104
101
if ( schema . AnyOf . Count != 0 )
105
102
{
106
- return TraverseSchemaElements ( discriminator , schema . AnyOf , schemaReferenceId , context , containsDiscriminator ) ;
103
+ return TraverseSchemaElements ( discriminatorName , schema . AnyOf , ref containsDiscriminator ) ;
107
104
}
108
105
if ( schema . AllOf . Count != 0 )
109
106
{
110
- return TraverseSchemaElements ( discriminator , schema . AllOf , schemaReferenceId , context , containsDiscriminator ) ;
107
+ return TraverseSchemaElements ( discriminatorName , schema . AllOf , ref containsDiscriminator ) ;
111
108
}
112
109
}
110
+ else
111
+ {
112
+ return true ;
113
+ }
113
114
114
115
return containsDiscriminator ;
115
116
}
116
117
117
118
/// <summary>
118
119
/// Traverses the schema elements and checks whether the schema contains the discriminator.
119
120
/// </summary>
120
- /// <param name="discriminator ">Adds support for polymorphism. The discriminator is an object name that is used to differentiate
121
+ /// <param name="discriminatorName ">Adds support for polymorphism. The discriminator is an object name that is used to differentiate
121
122
/// between other schemas which may satisfy the payload description.</param>
122
123
/// <param name="childSchema">The child schema.</param>
123
- /// <param name="schemaReferenceId"> The schema reference Id.</param>
124
- /// <param name="context"> A validation context.</param>
125
124
/// <param name="containsDiscriminator">Tracks whether the discriminator is present.</param>
126
125
/// <returns></returns>
127
- public static bool TraverseSchemaElements ( string discriminator , IList < OpenApiSchema > childSchema , string schemaReferenceId , IValidationContext context , bool containsDiscriminator )
126
+ public static bool TraverseSchemaElements ( string discriminatorName , IList < OpenApiSchema > childSchema , ref bool containsDiscriminator )
128
127
{
129
128
foreach ( var childItem in childSchema )
130
129
{
131
- if ( ! childItem . Properties . ContainsKey ( discriminator ) && ! childItem . Required . Contains ( discriminator ) )
130
+ if ( ( ! childItem . Properties ? . ContainsKey ( discriminatorName ) ?? false ) &&
131
+ ( ! childItem . Required ? . Contains ( discriminatorName ) ?? false ) )
132
132
{
133
- return ValidateChildSchemaAgainstDiscriminator ( childItem , discriminator , schemaReferenceId , context ) ;
133
+ return ValidateChildSchemaAgainstDiscriminator ( childItem , discriminatorName ) ;
134
134
}
135
135
else
136
136
{
0 commit comments