private async Task LoadEntry()

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;
        }