diff --git a/src/Microsoft.OpenApi.Readers/ParseNodes/MapNode.cs b/src/Microsoft.OpenApi.Readers/ParseNodes/MapNode.cs index f1a9c2cf3..0ee5934ce 100644 --- a/src/Microsoft.OpenApi.Readers/ParseNodes/MapNode.cs +++ b/src/Microsoft.OpenApi.Readers/ParseNodes/MapNode.cs @@ -93,7 +93,7 @@ public override Dictionary CreateMap(Func map) public override Dictionary CreateMapWithReference( ReferenceType referenceType, - Func map) + Func map) { var yamlMap = _node; if (yamlMap == null) @@ -104,28 +104,37 @@ public override Dictionary CreateMapWithReference( var nodes = yamlMap.Select( n => { - var entry = new - { - key = n.Key.GetScalarValue(), - value = map(new MapNode(Context, (YamlMappingNode)n.Value)) - }; - if (entry.value == null) - { - return null; // Body Parameters shouldn't be converted to Parameters - } - // If the component isn't a reference to another component, then point it to itself. - if (entry.value.Reference == null) + var key = n.Key.GetScalarValue(); + (string key, T value) entry; + try { - entry.value.Reference = new OpenApiReference() + Context.StartObject(key); + entry = ( + key: key, + value: map(new MapNode(Context, (YamlMappingNode)n.Value)) + ); + if (entry.value == null) + { + return default; // Body Parameters shouldn't be converted to Parameters + } + // If the component isn't a reference to another component, then point it to itself. + if (entry.value.Reference == null) { - Type = referenceType, - Id = entry.key - }; + entry.value.Reference = new OpenApiReference() + { + Type = referenceType, + Id = entry.key + }; + } + } + finally + { + Context.EndObject(); } return entry; } ); - return nodes.Where(n => n != null).ToDictionary(k => k.key, v => v.value); + return nodes.Where(n => n != default).ToDictionary(k => k.key, v => v.value); } public override Dictionary CreateSimpleMap(Func map) @@ -137,10 +146,21 @@ public override Dictionary CreateSimpleMap(Func map) } var nodes = yamlMap.Select( - n => new + n => { - key = n.Key.GetScalarValue(), - value = map(new ValueNode(Context, (YamlScalarNode)n.Value)) + var key = n.Key.GetScalarValue(); + try + { + Context.StartObject(key); + YamlScalarNode scalarNode = n.Value as YamlScalarNode; + if (scalarNode == null) + { + throw new OpenApiReaderException($"Expected scalar while parsing {typeof(T).Name}", Context); + } + return (key, value: map(new ValueNode(Context, (YamlScalarNode)n.Value))); + } finally { + Context.EndObject(); + } }); return nodes.ToDictionary(k => k.key, v => v.value); } diff --git a/test/Microsoft.OpenApi.SmokeTests/ApiGurus.cs b/test/Microsoft.OpenApi.SmokeTests/ApiGurus.cs index e424512ac..6d2eafc01 100644 --- a/test/Microsoft.OpenApi.SmokeTests/ApiGurus.cs +++ b/test/Microsoft.OpenApi.SmokeTests/ApiGurus.cs @@ -70,8 +70,9 @@ JToken GetProp(JToken obj, string prop) } } - // Disable as some APIs are currently invalid [Theory(DisplayName = "APIs.guru")] - // [MemberData(nameof(GetSchemas))] + // Disable as some APIs are currently invalid + //[Theory(DisplayName = "APIs.guru")] + //[MemberData(nameof(GetSchemas))] public async Task EnsureThatICouldParse(string url) { var response = await _httpClient.GetAsync(url);