@@ -40,23 +40,66 @@ internal get
4040 /// </summary>
4141 public void AddJsonReader ( )
4242 {
43+ TryAddReader ( OpenApiConstants . Json , new OpenApiJsonReader ( ) ) ;
44+ }
45+ /// <summary>
46+ /// Gets the reader for the specified format
47+ /// </summary>
48+ /// <param name="format">Format to fetch the reader for</param>
49+ /// <returns>The retrieved reader</returns>
50+ /// <exception cref="NotSupportedException">When no reader is registered for that format</exception>
51+ internal IOpenApiReader GetReader ( string format )
52+ {
53+ Utils . CheckArgumentNullOrEmpty ( format ) ;
54+ if ( Readers . TryGetValue ( format , out var reader ) )
55+ {
56+ return reader ;
57+ }
58+
59+ throw new NotSupportedException ( $ "Format '{ format } ' is not supported.") ;
60+ }
61+ /// <summary>
62+ /// Adds a reader for the specified format.
63+ /// This method is a no-op if the reader already exists.
64+ /// This method is equivalent to TryAdd, is provided for compatibility reasons and TryAdd should be used instead when available.
65+ /// </summary>
66+ /// <param name="format">Format to add a reader for</param>
67+ /// <param name="reader">Reader to add</param>
68+ /// <returns>True if the reader was added, false if it already existed</returns>
69+ public bool TryAddReader ( string format , IOpenApiReader reader )
70+ {
71+ Utils . CheckArgumentNullOrEmpty ( format ) ;
72+ Utils . CheckArgumentNull ( reader ) ;
4373#if NETSTANDARD2_1_OR_GREATER || NETCOREAPP || NET5_0_OR_GREATER
44- Readers . TryAdd ( OpenApiConstants . Json , new OpenApiJsonReader ( ) ) ;
74+ return Readers . TryAdd ( format , reader ) ;
4575#else
46- if ( ! Readers . ContainsKey ( OpenApiConstants . Json ) )
76+ if ( ! Readers . ContainsKey ( format ) )
4777 {
48- Readers . Add ( OpenApiConstants . Json , new OpenApiJsonReader ( ) ) ;
78+ Readers . Add ( format , reader ) ;
79+ return true ;
4980 }
81+ return false ;
5082#endif
5183 }
52- /// <summary>
53- /// Readers to use to parse the OpenAPI document
54- /// </summary>
55- public Dictionary < string , IOpenApiReader > Readers { get ; init ; } = new Dictionary < string , IOpenApiReader > ( StringComparer . OrdinalIgnoreCase )
84+ private Dictionary < string , IOpenApiReader > _readers = new ( StringComparer . OrdinalIgnoreCase )
5685 {
5786 { OpenApiConstants . Json , new OpenApiJsonReader ( ) }
5887 } ;
5988 /// <summary>
89+ /// Readers to use to parse the OpenAPI document
90+ /// </summary>
91+ public Dictionary < string , IOpenApiReader > Readers
92+ {
93+ get => _readers ;
94+ init
95+ {
96+ Utils . CheckArgumentNull ( value ) ;
97+ _readers = value . Comparer == StringComparer . OrdinalIgnoreCase ?
98+ value :
99+ new Dictionary < string , IOpenApiReader > ( value , StringComparer . OrdinalIgnoreCase ) ;
100+ }
101+ }
102+ /// <summary>
60103 /// When external references are found, load them into a shared workspace
61104 /// </summary>
62105 public bool LoadExternalRefs { get ; set ; } = false ;
@@ -107,18 +150,21 @@ public void AddJsonReader()
107150 /// </summary>
108151 public void AddMicrosoftExtensionParsers ( )
109152 {
110- if ( ! ExtensionParsers . ContainsKey ( OpenApiPagingExtension . Name ) )
111- ExtensionParsers . Add ( OpenApiPagingExtension . Name , static ( i , _ ) => OpenApiPagingExtension . Parse ( i ) ) ;
112- if ( ! ExtensionParsers . ContainsKey ( OpenApiEnumValuesDescriptionExtension . Name ) )
113- ExtensionParsers . Add ( OpenApiEnumValuesDescriptionExtension . Name , static ( i , _ ) => OpenApiEnumValuesDescriptionExtension . Parse ( i ) ) ;
114- if ( ! ExtensionParsers . ContainsKey ( OpenApiPrimaryErrorMessageExtension . Name ) )
115- ExtensionParsers . Add ( OpenApiPrimaryErrorMessageExtension . Name , static ( i , _ ) => OpenApiPrimaryErrorMessageExtension . Parse ( i ) ) ;
116- if ( ! ExtensionParsers . ContainsKey ( OpenApiDeprecationExtension . Name ) )
117- ExtensionParsers . Add ( OpenApiDeprecationExtension . Name , static ( i , _ ) => OpenApiDeprecationExtension . Parse ( i ) ) ;
118- if ( ! ExtensionParsers . ContainsKey ( OpenApiReservedParameterExtension . Name ) )
119- ExtensionParsers . Add ( OpenApiReservedParameterExtension . Name , static ( i , _ ) => OpenApiReservedParameterExtension . Parse ( i ) ) ;
120- if ( ! ExtensionParsers . ContainsKey ( OpenApiEnumFlagsExtension . Name ) )
121- ExtensionParsers . Add ( OpenApiEnumFlagsExtension . Name , static ( i , _ ) => OpenApiEnumFlagsExtension . Parse ( i ) ) ;
153+ TryAddExtensionParser ( OpenApiPagingExtension . Name , static ( i , _ ) => OpenApiPagingExtension . Parse ( i ) ) ;
154+ TryAddExtensionParser ( OpenApiEnumValuesDescriptionExtension . Name , static ( i , _ ) => OpenApiEnumValuesDescriptionExtension . Parse ( i ) ) ;
155+ TryAddExtensionParser ( OpenApiPrimaryErrorMessageExtension . Name , static ( i , _ ) => OpenApiPrimaryErrorMessageExtension . Parse ( i ) ) ;
156+ TryAddExtensionParser ( OpenApiDeprecationExtension . Name , static ( i , _ ) => OpenApiDeprecationExtension . Parse ( i ) ) ;
157+ TryAddExtensionParser ( OpenApiReservedParameterExtension . Name , static ( i , _ ) => OpenApiReservedParameterExtension . Parse ( i ) ) ;
158+ TryAddExtensionParser ( OpenApiEnumFlagsExtension . Name , static ( i , _ ) => OpenApiEnumFlagsExtension . Parse ( i ) ) ;
159+ }
160+ private void TryAddExtensionParser ( string name , Func < JsonNode , OpenApiSpecVersion , IOpenApiExtension > parser )
161+ {
162+ #if NETSTANDARD2_1_OR_GREATER || NETCOREAPP || NET5_0_OR_GREATER
163+ ExtensionParsers . TryAdd ( name , parser ) ;
164+ #else
165+ if ( ! ExtensionParsers . ContainsKey ( name ) )
166+ ExtensionParsers . Add ( name , parser ) ;
167+ #endif
122168 }
123169 }
124170}
0 commit comments