in src/Microsoft.Atlas.CommandLine/Swagger/SwaggarDocumentLoader.cs [50:109]
private async Task<SwaggerDocumentEntry> LoadEntry(string basePath, string relativePath)
{
var effectivePath = CombinePaths(basePath, relativePath);
if (_loaded.TryGetValue(effectivePath, out var value))
{
return value;
}
var swaggerText = await _httpClient.GetStringAsync(effectivePath);
var swaggerDocument = _yamlSerializers.YamlDeserializer.Deserialize<SwaggerDocument>(swaggerText);
var entry = new SwaggerDocumentEntry
{
SwaggerDocument = swaggerDocument
};
foreach (var definition in swaggerDocument.definitions)
{
entry.Targets.Add($"#/definitions/{definition.Key}", definition.Value);
}
foreach (var parameter in swaggerDocument.parameters)
{
entry.Targets.Add($"#/parameters/{parameter.Key}", parameter.Value);
}
_loaded.Add(effectivePath, entry);
var p1 = swaggerDocument.parameters.Values;
var p2 = swaggerDocument.paths.Values.SelectMany(x => x.parameters);
var p3 = swaggerDocument.paths.Values.SelectMany(x => x.operations).SelectMany(x => x.Value.parameters);
var parameters = p1.Concat(p2).Concat(p3);
foreach (var parameter in parameters.Where(x => x.@ref != null))
{
var refString = parameter.@ref;
var hashIndex = refString.IndexOf('#');
var refRelative = refString.Substring(0, hashIndex);
var fragment = refString.Substring(hashIndex);
var targetEntry = await LoadEntry(effectivePath, refRelative);
entry.References[parameter] = targetEntry.Targets[fragment];
}
var s1 = swaggerDocument.definitions.Values;
var s2 = parameters.Where(x => x.schema != null).Select(x => x.schema);
var schemas = s1.Concat(s2).SelectMany(FlattenSchemas);
foreach (var schema in schemas.Where(x => x.@ref != null))
{
var refString = schema.@ref;
var hashIndex = refString.IndexOf('#');
var refRelative = refString.Substring(0, hashIndex);
var fragment = refString.Substring(hashIndex);
var targetEntry = await LoadEntry(effectivePath, refRelative);
entry.References[schema] = targetEntry.Targets[fragment];
}
return entry;
}