in tools/code/publisher/WorkspaceApi.cs [294:335]
private static FindWorkspaceApiSpecificationContents GetFindWorkspaceApiSpecificationContents(IServiceProvider provider)
{
var serviceDirectory = provider.GetRequiredService<ManagementServiceDirectory>();
var tryGetFileContents = provider.GetRequiredService<TryGetFileContents>();
var getArtifactFiles = provider.GetRequiredService<GetArtifactFiles>();
return async (name, workspaceName, cancellationToken) =>
await getSpecificationFiles(name, workspaceName)
.ToAsyncEnumerable()
.Choose(async file => await tryGetSpecificationContentsFromFile(file, cancellationToken))
.FirstOrNone(cancellationToken);
FrozenSet<FileInfo> getSpecificationFiles(ApiName name, WorkspaceName workspaceName)
{
var apiDirectory = WorkspaceApiDirectory.From(name, workspaceName, serviceDirectory);
var artifactFiles = getArtifactFiles();
return Common.SpecificationFileNames
.Select(apiDirectory.ToDirectoryInfo().GetChildFile)
.Where(artifactFiles.Contains)
.ToFrozenSet();
}
async ValueTask<Option<(ApiSpecification, BinaryData)>> tryGetSpecificationContentsFromFile(FileInfo file, CancellationToken cancellationToken)
{
var contentsOption = await tryGetFileContents(file, cancellationToken);
return await contentsOption.BindTask(async contents =>
{
var specificationFileOption = await tryParseSpecificationFile(file, contents, cancellationToken);
return from specificationFile in specificationFileOption
select (specificationFile.Specification, contents);
});
}
async ValueTask<Option<ApiSpecificationFile>> tryParseSpecificationFile(FileInfo file, BinaryData contents, CancellationToken cancellationToken) =>
await ApiSpecificationFile.TryParse(file,
getFileContents: _ => ValueTask.FromResult(contents),
serviceDirectory,
cancellationToken);
}