1- using System ;
2- using System . Collections . Generic ;
1+ // Copyright (c) Microsoft Corporation. All rights reserved.
2+ // Licensed under the MIT license.
3+
4+ using System ;
35using System . IO ;
46using System . Linq ;
57using System . Net ;
1214using Microsoft . OpenApi . Validations ;
1315using Microsoft . OpenApi . Writers ;
1416
15- namespace Microsoft . OpenApi . Tool
17+ namespace Microsoft . OpenApi . Hidi
1618{
1719 static class OpenApiService
1820 {
@@ -21,29 +23,55 @@ public static void ProcessOpenApiDocument(
2123 FileInfo output ,
2224 OpenApiSpecVersion version ,
2325 OpenApiFormat format ,
26+ string filterByOperationIds ,
27+ string filterByTags ,
2428 bool inline ,
2529 bool resolveExternal )
2630 {
27- if ( input == null )
31+ if ( string . IsNullOrEmpty ( input ) )
2832 {
29- throw new ArgumentNullException ( "input" ) ;
33+ throw new ArgumentNullException ( nameof ( input ) ) ;
34+ }
35+ if ( output == null )
36+ {
37+ throw new ArgumentException ( nameof ( output ) ) ;
38+ }
39+ if ( output . Exists )
40+ {
41+ throw new IOException ( "The file you're writing to already exists. Please input a new output path." ) ;
3042 }
3143
3244 var stream = GetStream ( input ) ;
33-
34- OpenApiDocument document ;
35-
3645 var result = new OpenApiStreamReader ( new OpenApiReaderSettings
3746 {
38- ReferenceResolution = resolveExternal == true ? ReferenceResolutionSetting . ResolveAllReferences : ReferenceResolutionSetting . ResolveLocalReferences ,
47+ ReferenceResolution = resolveExternal ? ReferenceResolutionSetting . ResolveAllReferences : ReferenceResolutionSetting . ResolveLocalReferences ,
3948 RuleSet = ValidationRuleSet . GetDefaultRuleSet ( )
4049 }
4150 ) . ReadAsync ( stream ) . GetAwaiter ( ) . GetResult ( ) ;
4251
52+ OpenApiDocument document ;
4353 document = result . OpenApiDocument ;
54+
55+ // Check if filter options are provided, then execute
56+ if ( ! string . IsNullOrEmpty ( filterByOperationIds ) && ! string . IsNullOrEmpty ( filterByTags ) )
57+ {
58+ throw new InvalidOperationException ( "Cannot filter by operationIds and tags at the same time." ) ;
59+ }
60+
61+ if ( ! string . IsNullOrEmpty ( filterByOperationIds ) )
62+ {
63+ var predicate = OpenApiFilterService . CreatePredicate ( operationIds : filterByOperationIds ) ;
64+ document = OpenApiFilterService . CreateFilteredDocument ( document , predicate ) ;
65+ }
66+ if ( ! string . IsNullOrEmpty ( filterByTags ) )
67+ {
68+ var predicate = OpenApiFilterService . CreatePredicate ( tags : filterByTags ) ;
69+ document = OpenApiFilterService . CreateFilteredDocument ( document , predicate ) ;
70+ }
71+
4472 var context = result . OpenApiDiagnostic ;
4573
46- if ( context . Errors . Count != 0 )
74+ if ( context . Errors . Count > 0 )
4775 {
4876 var errorReport = new StringBuilder ( ) ;
4977
@@ -52,43 +80,26 @@ public static void ProcessOpenApiDocument(
5280 errorReport . AppendLine ( error . ToString ( ) ) ;
5381 }
5482
55- throw new ArgumentException ( String . Join ( Environment . NewLine , context . Errors . Select ( e => e . Message ) . ToArray ( ) ) ) ;
83+ throw new ArgumentException ( string . Join ( Environment . NewLine , context . Errors . Select ( e => e . Message ) . ToArray ( ) ) ) ;
5684 }
5785
58- using ( var outputStream = output ? . Create ( ) )
59- {
60- TextWriter textWriter ;
86+ using var outputStream = output ? . Create ( ) ;
6187
62- if ( outputStream != null )
63- {
64- textWriter = new StreamWriter ( outputStream ) ;
65- }
66- else
67- {
68- textWriter = Console . Out ;
69- }
88+ var textWriter = outputStream != null ? new StreamWriter ( outputStream ) : Console . Out ;
7089
71- var settings = new OpenApiWriterSettings ( )
72- {
73- ReferenceInline = inline == true ? ReferenceInlineSetting . InlineLocalReferences : ReferenceInlineSetting . DoNotInlineReferences
74- } ;
75- IOpenApiWriter writer ;
76- switch ( format )
77- {
78- case OpenApiFormat . Json :
79- writer = new OpenApiJsonWriter ( textWriter , settings ) ;
80- break ;
81- case OpenApiFormat . Yaml :
82- writer = new OpenApiYamlWriter ( textWriter , settings ) ;
83- break ;
84- default :
85- throw new ArgumentException ( "Unknown format" ) ;
86- }
87-
88- document . Serialize ( writer , version ) ;
90+ var settings = new OpenApiWriterSettings ( )
91+ {
92+ ReferenceInline = inline ? ReferenceInlineSetting . InlineLocalReferences : ReferenceInlineSetting . DoNotInlineReferences
93+ } ;
94+ IOpenApiWriter writer = format switch
95+ {
96+ OpenApiFormat . Json => new OpenApiJsonWriter ( textWriter , settings ) ,
97+ OpenApiFormat . Yaml => new OpenApiYamlWriter ( textWriter , settings ) ,
98+ _ => throw new ArgumentException ( "Unknown format" ) ,
99+ } ;
100+ document . Serialize ( writer , version ) ;
89101
90- textWriter . Flush ( ) ;
91- }
102+ textWriter . Flush ( ) ;
92103 }
93104
94105 private static Stream GetStream ( string input )
@@ -127,7 +138,6 @@ internal static void ValidateOpenApiDocument(string input)
127138
128139 document = new OpenApiStreamReader ( new OpenApiReaderSettings
129140 {
130- //ReferenceResolution = resolveExternal == true ? ReferenceResolutionSetting.ResolveAllReferences : ReferenceResolutionSetting.ResolveLocalReferences,
131141 RuleSet = ValidationRuleSet . GetDefaultRuleSet ( )
132142 }
133143 ) . Read ( stream , out var context ) ;
0 commit comments