Skip to content

Commit f9a529b

Browse files
committed
chore: update-discriminator-mapping
1 parent 7f4bec8 commit f9a529b

File tree

9 files changed

+63
-25
lines changed

9 files changed

+63
-25
lines changed

src/Microsoft.OpenApi/Models/OpenApiDiscriminator.cs

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
// Copyright (c) Microsoft Corporation. All rights reserved.
22
// Licensed under the MIT license.
33

4+
using System;
45
using System.Collections.Generic;
56
using Microsoft.OpenApi.Interfaces;
7+
using Microsoft.OpenApi.Models.References;
68
using Microsoft.OpenApi.Writers;
79

810
namespace Microsoft.OpenApi.Models
@@ -20,7 +22,7 @@ public class OpenApiDiscriminator : IOpenApiSerializable, IOpenApiExtensible
2022
/// <summary>
2123
/// An object to hold mappings between payload values and schema names or references.
2224
/// </summary>
23-
public IDictionary<string, string>? Mapping { get; set; } = new Dictionary<string, string>();
25+
public IDictionary<string, OpenApiSchemaReference>? Mapping { get; set; } = new Dictionary<string, OpenApiSchemaReference>();
2426

2527
/// <summary>
2628
/// This object MAY be extended with Specification Extensions.
@@ -38,7 +40,7 @@ public OpenApiDiscriminator() { }
3840
public OpenApiDiscriminator(OpenApiDiscriminator discriminator)
3941
{
4042
PropertyName = discriminator?.PropertyName ?? PropertyName;
41-
Mapping = discriminator?.Mapping != null ? new Dictionary<string, string>(discriminator.Mapping) : null;
43+
Mapping = discriminator?.Mapping != null ? new Dictionary<string, OpenApiSchemaReference>(discriminator.Mapping) : null;
4244
Extensions = discriminator?.Extensions != null ? new Dictionary<string, IOpenApiExtension>(discriminator.Extensions) : null;
4345
}
4446

@@ -48,7 +50,8 @@ public OpenApiDiscriminator(OpenApiDiscriminator discriminator)
4850
/// <param name="writer"></param>
4951
public void SerializeAsV31(IOpenApiWriter writer)
5052
{
51-
SerializeInternal(writer);
53+
SerializeInternal(writer,
54+
(writer, referenceElement) => referenceElement.SerializeAsV31(writer));
5255

5356
// extensions
5457
writer.WriteExtensions(Extensions, OpenApiSpecVersion.OpenApi3_1);
@@ -61,16 +64,16 @@ public void SerializeAsV31(IOpenApiWriter writer)
6164
/// </summary>
6265
public void SerializeAsV3(IOpenApiWriter writer)
6366
{
64-
SerializeInternal(writer);
67+
SerializeInternal(writer,
68+
(writer, referenceElement) => referenceElement.SerializeAsV3(writer));
6569

6670
writer.WriteEndObject();
6771
}
6872

6973
/// <summary>
7074
/// Serialize <see cref="OpenApiDiscriminator"/> to Open Api v3.0
7175
/// </summary>
72-
/// <param name="writer"></param>
73-
private void SerializeInternal(IOpenApiWriter writer)
76+
private void SerializeInternal(IOpenApiWriter writer, Action<IOpenApiWriter, IOpenApiReferenceHolder> action)
7477
{
7578
Utils.CheckArgumentNull(writer);
7679

@@ -80,7 +83,7 @@ private void SerializeInternal(IOpenApiWriter writer)
8083
writer.WriteProperty(OpenApiConstants.PropertyName, PropertyName);
8184

8285
// mapping
83-
writer.WriteOptionalMap(OpenApiConstants.Mapping, Mapping, (w, s) => w.WriteValue(s));
86+
writer.WriteOptionalMap(OpenApiConstants.Mapping, Mapping, (w, key, reference) => action(w, reference));
8487
}
8588

8689
/// <summary>

src/Microsoft.OpenApi/Reader/V3/OpenApiDiscriminatorDeserializer.cs

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
// Copyright (c) Microsoft Corporation. All rights reserved.
22
// Licensed under the MIT license.
33

4+
using System.Collections.Generic;
45
using System.Linq;
56
using Microsoft.OpenApi.Models;
7+
using Microsoft.OpenApi.Models.References;
68
using Microsoft.OpenApi.Reader.ParseNodes;
79

810
namespace Microsoft.OpenApi.Reader.V3
@@ -22,7 +24,7 @@ internal static partial class OpenApiV3Deserializer
2224
},
2325
{
2426
"mapping",
25-
(o, n, _) => o.Mapping = n.CreateSimpleMap(LoadString).Where(kv => kv.Value is not null).ToDictionary(kv => kv.Key, kv => kv.Value!)
27+
(o, n, doc) => o.Mapping = n.CreateMap(LoadMapping, doc)
2628
}
2729
};
2830

@@ -40,5 +42,13 @@ public static OpenApiDiscriminator LoadDiscriminator(ParseNode node, OpenApiDocu
4042

4143
return discriminator;
4244
}
45+
public static OpenApiSchemaReference LoadMapping(ParseNode node, OpenApiDocument hostDocument)
46+
{
47+
var mapNode = node.CheckMapNode("mapping");
48+
49+
var pointer = mapNode.GetReferencePointer();
50+
var reference = GetReferenceIdAndExternalResource(pointer!);
51+
return new OpenApiSchemaReference(reference.Item1, hostDocument, reference.Item2);
52+
}
4353
}
4454
}

src/Microsoft.OpenApi/Reader/V3/OpenApiV3VersionService.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
using Microsoft.OpenApi.Extensions;
1010
using Microsoft.OpenApi.Interfaces;
1111
using Microsoft.OpenApi.Models;
12+
using Microsoft.OpenApi.Models.References;
1213
using Microsoft.OpenApi.Properties;
1314
using Microsoft.OpenApi.Reader.ParseNodes;
1415

@@ -62,7 +63,8 @@ public OpenApiV3VersionService(OpenApiDiagnostic diagnostic)
6263
[typeof(OpenApiServer)] = OpenApiV3Deserializer.LoadServer,
6364
[typeof(OpenApiServerVariable)] = OpenApiV3Deserializer.LoadServerVariable,
6465
[typeof(OpenApiTag)] = OpenApiV3Deserializer.LoadTag,
65-
[typeof(OpenApiXml)] = OpenApiV3Deserializer.LoadXml
66+
[typeof(OpenApiXml)] = OpenApiV3Deserializer.LoadXml,
67+
[typeof(OpenApiSchemaReference)] = OpenApiV3Deserializer.LoadMapping
6668
};
6769

6870
public OpenApiDocument LoadDocument(RootNode rootNode)

src/Microsoft.OpenApi/Reader/V31/OpenApiDiscriminatorDeserializer.cs

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
using System;
2+
using System.Collections.Generic;
23
using System.Linq;
34
using Microsoft.OpenApi.Extensions;
45
using Microsoft.OpenApi.Models;
6+
using Microsoft.OpenApi.Models.References;
57
using Microsoft.OpenApi.Reader.ParseNodes;
68

79
namespace Microsoft.OpenApi.Reader.V31
@@ -22,9 +24,9 @@ internal static partial class OpenApiV31Deserializer
2224
}
2325
},
2426
{
25-
"mapping", (o, n, _) =>
27+
"mapping", (o, n, doc) =>
2628
{
27-
o.Mapping = n.CreateSimpleMap(LoadString).Where(kv => kv.Value is not null).ToDictionary(kv => kv.Key, kv => kv.Value!);
29+
o.Mapping = n.CreateMap(LoadMapping, doc);
2830
}
2931
}
3032
};
@@ -47,5 +49,14 @@ public static OpenApiDiscriminator LoadDiscriminator(ParseNode node, OpenApiDocu
4749

4850
return discriminator;
4951
}
52+
53+
public static OpenApiSchemaReference LoadMapping(ParseNode node, OpenApiDocument hostDocument)
54+
{
55+
var mapNode = node.CheckMapNode("mapping");
56+
57+
var pointer = mapNode.GetReferencePointer();
58+
var reference = GetReferenceIdAndExternalResource(pointer!);
59+
return new OpenApiSchemaReference(reference.Item1, hostDocument, reference.Item2);
60+
}
5061
}
5162
}

src/Microsoft.OpenApi/Reader/V31/OpenApiV31VersionService.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
using Microsoft.OpenApi.Extensions;
1010
using Microsoft.OpenApi.Interfaces;
1111
using Microsoft.OpenApi.Models;
12+
using Microsoft.OpenApi.Models.References;
1213
using Microsoft.OpenApi.Properties;
1314
using Microsoft.OpenApi.Reader.ParseNodes;
1415
using Microsoft.OpenApi.Reader.V3;
@@ -61,7 +62,8 @@ public OpenApiV31VersionService(OpenApiDiagnostic diagnostic)
6162
[typeof(OpenApiServer)] = OpenApiV31Deserializer.LoadServer,
6263
[typeof(OpenApiServerVariable)] = OpenApiV31Deserializer.LoadServerVariable,
6364
[typeof(OpenApiTag)] = OpenApiV31Deserializer.LoadTag,
64-
[typeof(OpenApiXml)] = OpenApiV31Deserializer.LoadXml
65+
[typeof(OpenApiXml)] = OpenApiV31Deserializer.LoadXml,
66+
[typeof(OpenApiSchemaReference)] = OpenApiV31Deserializer.LoadMapping
6567
};
6668

6769
public OpenApiDocument LoadDocument(RootNode rootNode)

test/Microsoft.OpenApi.Readers.Tests/V31Tests/Samples/OpenApiDocument/docWithExample.yaml

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -75,8 +75,10 @@ components: # Reusable components for the API
7575
discriminator: # The discriminator for resolving the concrete schema type
7676
propertyName: petType
7777
mapping:
78-
cat: '#/components/schemas/Cat'
79-
dog: '#/components/schemas/Dog'
78+
cat:
79+
$ref: '#/components/schemas/Cat'
80+
dog:
81+
$ref: '#/components/schemas/Dog'
8082
Cat: # A schema for a cat object
8183
allOf:
8284
- $ref: '#/components/schemas/Pet'

test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiDiscriminatorTests.cs

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,15 @@
11
// Copyright (c) Microsoft Corporation. All rights reserved.
22
// Licensed under the MIT license.
33

4+
using System;
5+
using System.Diagnostics;
46
using System.IO;
57
using System.Threading.Tasks;
68
using Microsoft.OpenApi.Models;
9+
using Microsoft.OpenApi.Models.References;
710
using Microsoft.OpenApi.Reader;
11+
using Microsoft.VisualStudio.TestPlatform.Utilities;
12+
using Newtonsoft.Json;
813
using Xunit;
914

1015
namespace Microsoft.OpenApi.Readers.Tests.V3Tests
@@ -25,19 +30,20 @@ public async Task ParseBasicDiscriminatorShouldSucceed()
2530
memoryStream.Position = 0;
2631

2732
// Act
28-
var discriminator = OpenApiModelFactory.Load<OpenApiDiscriminator>(memoryStream, OpenApiSpecVersion.OpenApi3_0, OpenApiConstants.Yaml, new(), out var diagnostic, SettingsFixture.ReaderSettings);
33+
var openApiDocument = new OpenApiDocument();
34+
var discriminator = OpenApiModelFactory.Load<OpenApiDiscriminator>(memoryStream, OpenApiSpecVersion.OpenApi3_0, OpenApiConstants.Yaml, openApiDocument, out var diagnostic, SettingsFixture.ReaderSettings);
2935

3036
// Assert
3137
Assert.Equivalent(
32-
new OpenApiDiscriminator
33-
{
34-
PropertyName = "pet_type",
35-
Mapping =
38+
new OpenApiDiscriminator
39+
{
40+
PropertyName = "pet_type",
41+
Mapping =
3642
{
37-
["puppy"] = "#/components/schemas/Dog",
38-
["kitten"] = "Cat"
43+
["puppy"] = new OpenApiSchemaReference("Dog", openApiDocument),
44+
["kitten"] = new OpenApiSchemaReference("Cat", openApiDocument)
3945
}
40-
}, discriminator);
46+
}, discriminator);
4147
}
4248
}
4349
}
Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
propertyName: pet_type
22
mapping:
3-
puppy: '#/components/schemas/Dog'
4-
kitten: Cat
3+
puppy:
4+
$ref: '#/components/schemas/Dog'
5+
kitten:
6+
$ref: '#/components/schemas/Cat'

test/Microsoft.OpenApi.Tests/PublicApi/PublicApi.approved.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -699,7 +699,7 @@ namespace Microsoft.OpenApi.Models
699699
public OpenApiDiscriminator() { }
700700
public OpenApiDiscriminator(Microsoft.OpenApi.Models.OpenApiDiscriminator discriminator) { }
701701
public System.Collections.Generic.IDictionary<string, Microsoft.OpenApi.Interfaces.IOpenApiExtension>? Extensions { get; set; }
702-
public System.Collections.Generic.IDictionary<string, string>? Mapping { get; set; }
702+
public System.Collections.Generic.IDictionary<string, Microsoft.OpenApi.Models.References.OpenApiSchemaReference>? Mapping { get; set; }
703703
public string? PropertyName { get; set; }
704704
public void SerializeAsV2(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { }
705705
public void SerializeAsV3(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { }

0 commit comments

Comments
 (0)