private static ListWorkspaceApis GetListWorkspaceApis()

in tools/code/extractor/WorkspaceApi.cs [70:112]


    private static ListWorkspaceApis GetListWorkspaceApis(IServiceProvider provider)
    {
        var defaultApiSpecification = provider.GetRequiredService<DefaultApiSpecification>();
        var serviceUri = provider.GetRequiredService<ManagementServiceUri>();
        var pipeline = provider.GetRequiredService<HttpPipeline>();

        return (workspaceName, cancellationToken) =>
        {
            var workspaceApisUri = WorkspaceApisUri.From(workspaceName, serviceUri);

            return workspaceApisUri.List(pipeline, cancellationToken)
                                   .SelectAwait(async api =>
                                   {
                                       var (name, dto) = api;
                                       var specificationContentsOption = await tryGetSpecificationContents(name, dto, workspaceName, cancellationToken);
                                       return (name, dto, specificationContentsOption);
                                   });
        };

        async ValueTask<Option<(ApiSpecification, BinaryData)>> tryGetSpecificationContents(ApiName name, WorkspaceApiDto dto, WorkspaceName workspaceName, CancellationToken cancellationToken)
        {
            var specificationOption = tryGetSpecification(dto);

            return await specificationOption.BindTask(async specification =>
            {
                var uri = WorkspaceApiUri.From(name, workspaceName, serviceUri);
                var contentsOption = await uri.TryGetSpecificationContents(specification, pipeline, cancellationToken);

                return from contents in contentsOption
                       select (specification, contents);
            });
        }

        Option<ApiSpecification> tryGetSpecification(WorkspaceApiDto dto) =>
            (dto.Properties.Type ?? dto.Properties.ApiType) switch
            {
                "graphql" => new ApiSpecification.GraphQl(),
                "soap" => new ApiSpecification.Wsdl(),
                "http" => defaultApiSpecification.Value,
                null => defaultApiSpecification.Value,
                _ => Option<ApiSpecification>.None
            };
    }