in src/Microsoft.OpenApi.Hidi/OpenApiService.cs [23:116]
public static void ProcessOpenApiDocument(
string input,
FileInfo output,
OpenApiSpecVersion? version,
OpenApiFormat? format,
string filterByOperationIds,
string filterByTags,
string filterByCollection,
bool inline,
bool resolveExternal)
{
if (string.IsNullOrEmpty(input))
{
throw new ArgumentNullException(nameof(input));
}
if(output == null)
{
throw new ArgumentException(nameof(output));
}
if (output.Exists)
{
throw new IOException("The file you're writing to already exists. Please input a new output path.");
}
var stream = GetStream(input);
var result = new OpenApiStreamReader(new OpenApiReaderSettings
{
ReferenceResolution = resolveExternal ? ReferenceResolutionSetting.ResolveAllReferences : ReferenceResolutionSetting.ResolveLocalReferences,
RuleSet = ValidationRuleSet.GetDefaultRuleSet()
}
).ReadAsync(stream).GetAwaiter().GetResult();
var document = result.OpenApiDocument;
Func<string, OperationType?, OpenApiOperation, bool> predicate;
// Check if filter options are provided, then execute
if (!string.IsNullOrEmpty(filterByOperationIds) && !string.IsNullOrEmpty(filterByTags))
{
throw new InvalidOperationException("Cannot filter by operationIds and tags at the same time.");
}
if (!string.IsNullOrEmpty(filterByOperationIds))
{
predicate = OpenApiFilterService.CreatePredicate(operationIds: filterByOperationIds);
document = OpenApiFilterService.CreateFilteredDocument(document, predicate);
}
if (!string.IsNullOrEmpty(filterByTags))
{
predicate = OpenApiFilterService.CreatePredicate(tags: filterByTags);
document = OpenApiFilterService.CreateFilteredDocument(document, predicate);
}
if (!string.IsNullOrEmpty(filterByCollection))
{
var fileStream = GetStream(filterByCollection);
var requestUrls = ParseJsonCollectionFile(fileStream);
predicate = OpenApiFilterService.CreatePredicate(requestUrls: requestUrls, source:document);
document = OpenApiFilterService.CreateFilteredDocument(document, predicate);
}
var context = result.OpenApiDiagnostic;
if (context.Errors.Count > 0)
{
var errorReport = new StringBuilder();
foreach (var error in context.Errors)
{
errorReport.AppendLine(error.ToString());
}
throw new ArgumentException(string.Join(Environment.NewLine, context.Errors.Select(e => e.Message).ToArray()));
}
using var outputStream = output?.Create();
var textWriter = outputStream != null ? new StreamWriter(outputStream) : Console.Out;
var settings = new OpenApiWriterSettings()
{
ReferenceInline = inline ? ReferenceInlineSetting.InlineLocalReferences : ReferenceInlineSetting.DoNotInlineReferences
};
var openApiFormat = format ?? GetOpenApiFormat(input);
var openApiVersion = version ?? result.OpenApiDiagnostic.SpecificationVersion;
IOpenApiWriter writer = openApiFormat switch
{
OpenApiFormat.Json => new OpenApiJsonWriter(textWriter, settings),
OpenApiFormat.Yaml => new OpenApiYamlWriter(textWriter, settings),
_ => throw new ArgumentException("Unknown format"),
};
document.Serialize(writer, openApiVersion);
textWriter.Flush();
}