@@ -40,23 +40,66 @@ internal get
40
40
/// </summary>
41
41
public void AddJsonReader ( )
42
42
{
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 ) ;
43
73
#if NETSTANDARD2_1_OR_GREATER || NETCOREAPP || NET5_0_OR_GREATER
44
- Readers . TryAdd ( OpenApiConstants . Json , new OpenApiJsonReader ( ) ) ;
74
+ return Readers . TryAdd ( format , reader ) ;
45
75
#else
46
- if ( ! Readers . ContainsKey ( OpenApiConstants . Json ) )
76
+ if ( ! Readers . ContainsKey ( format ) )
47
77
{
48
- Readers . Add ( OpenApiConstants . Json , new OpenApiJsonReader ( ) ) ;
78
+ Readers . Add ( format , reader ) ;
79
+ return true ;
49
80
}
81
+ return false ;
50
82
#endif
51
83
}
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 )
56
85
{
57
86
{ OpenApiConstants . Json , new OpenApiJsonReader ( ) }
58
87
} ;
59
88
/// <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>
60
103
/// When external references are found, load them into a shared workspace
61
104
/// </summary>
62
105
public bool LoadExternalRefs { get ; set ; } = false ;
@@ -107,18 +150,21 @@ public void AddJsonReader()
107
150
/// </summary>
108
151
public void AddMicrosoftExtensionParsers ( )
109
152
{
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
122
168
}
123
169
}
124
170
}
0 commit comments