@@ -72,7 +72,7 @@ public readonly struct TypeInfoMapping(Type type, string dataTypeName, TypeInfoF
7272
7373 public bool TypeEquals ( Type type ) => TypeMatchPredicate ? . Invoke ( type ) ?? Type == type ;
7474
75- private bool DataTypeNameEqualsCore ( string dataTypeName )
75+ bool DataTypeNameEqualsCore ( string dataTypeName )
7676 {
7777 var span = DataTypeName . AsSpan ( ) ;
7878 return Postgres . DataTypeName . IsFullyQualified ( span )
@@ -196,7 +196,7 @@ TypeInfoMapping GetMapping(Type type, string dataTypeName)
196196 => TryGetMapping ( type , dataTypeName , out var info ) ? info : throw new InvalidOperationException ( $ "Could not find mapping for { type } <-> { dataTypeName } ") ;
197197
198198 // Helper to eliminate generic display class duplication.
199- static TypeInfoFactory CreateComposedFactory ( Type mappingType , TypeInfoMapping innerMapping , Func < TypeInfoMapping , PgTypeInfo , PgConverter > mapper , bool copyPreferredFormat = false , bool supportsWriting = true )
199+ static TypeInfoFactory CreateComposedFactory ( Type mappingType , TypeInfoMapping innerMapping , Func < TypeInfoMapping , PgTypeInfo , PgConverter > mapper , bool copyPreferredFormat = false , bool ? supportsReading = null , bool ? supportsWriting = null )
200200 => ( options , mapping , requiresDataTypeName ) =>
201201 {
202202 var resolvedInnerMapping = innerMapping ;
@@ -207,8 +207,8 @@ static TypeInfoFactory CreateComposedFactory(Type mappingType, TypeInfoMapping i
207207 var converter = mapper ( mapping , innerInfo ) ;
208208 var preferredFormat = copyPreferredFormat ? innerInfo . PreferredFormat : null ;
209209 var unboxedType = ComputeUnboxedType ( defaultType : mappingType , converter . TypeToConvert , mapping . Type ) ;
210- var readingSupported = innerInfo . SupportsReading && PgTypeInfo . GetDefaultSupportsReading ( converter . TypeToConvert , unboxedType ) ;
211- var writingSupported = supportsWriting && innerInfo . SupportsWriting ;
210+ var readingSupported = innerInfo . SupportsReading && ( supportsReading ?? PgTypeInfo . GetDefaultSupportsReading ( converter . TypeToConvert , unboxedType ) ) ;
211+ var writingSupported = innerInfo . SupportsWriting && ( supportsWriting ?? true ) ;
212212
213213 return new PgTypeInfo ( options , converter , options . GetCanonicalTypeId ( new DataTypeName ( mapping . DataTypeName ) ) , unboxedType )
214214 {
@@ -219,7 +219,7 @@ static TypeInfoFactory CreateComposedFactory(Type mappingType, TypeInfoMapping i
219219 } ;
220220
221221 // Helper to eliminate generic display class duplication.
222- static TypeInfoFactory CreateComposedFactory ( Type mappingType , TypeInfoMapping innerMapping , Func < TypeInfoMapping , PgResolverTypeInfo , PgConverterResolver > mapper , bool copyPreferredFormat = false , bool supportsWriting = true )
222+ static TypeInfoFactory CreateComposedFactory ( Type mappingType , TypeInfoMapping innerMapping , Func < TypeInfoMapping , PgResolverTypeInfo , PgConverterResolver > mapper , bool copyPreferredFormat = false , bool ? supportsReading = null , bool ? supportsWriting = null )
223223 => ( options , mapping , requiresDataTypeName ) =>
224224 {
225225 var resolvedInnerMapping = innerMapping ;
@@ -230,8 +230,8 @@ static TypeInfoFactory CreateComposedFactory(Type mappingType, TypeInfoMapping i
230230 var resolver = mapper ( mapping , innerInfo ) ;
231231 var preferredFormat = copyPreferredFormat ? innerInfo . PreferredFormat : null ;
232232 var unboxedType = ComputeUnboxedType ( defaultType : mappingType , resolver . TypeToConvert , mapping . Type ) ;
233- var readingSupported = innerInfo . SupportsReading && PgTypeInfo . GetDefaultSupportsReading ( resolver . TypeToConvert , unboxedType ) ;
234- var writingSupported = supportsWriting && innerInfo . SupportsWriting ;
233+ var readingSupported = innerInfo . SupportsReading && ( supportsReading ?? PgTypeInfo . GetDefaultSupportsReading ( resolver . TypeToConvert , unboxedType ) ) ;
234+ var writingSupported = innerInfo . SupportsWriting && ( supportsWriting ?? true ) ;
235235 // We include the data type name if the inner info did so as well.
236236 // This way we can rely on its logic around resolvedDataTypeName, including when it ignores that flag.
237237 PgTypeId ? pgTypeId = innerInfo . PgTypeId is not null
@@ -355,7 +355,7 @@ public void AddArrayType<TElement>(TypeInfoMapping elementMapping, bool suppress
355355
356356 void AddArrayType ( TypeInfoMapping elementMapping , Type type , Func < TypeInfoMapping , PgTypeInfo , PgConverter > converter , Func < Type ? , bool > ? typeMatchPredicate = null , bool suppressObjectMapping = false )
357357 {
358- var arrayMapping = new TypeInfoMapping ( type , arrayDataTypeName , CreateComposedFactory ( type , elementMapping , converter ) )
358+ var arrayMapping = new TypeInfoMapping ( type , arrayDataTypeName , CreateComposedFactory ( type , elementMapping , converter , supportsReading : true ) )
359359 {
360360 MatchRequirement = elementMapping . MatchRequirement ,
361361 TypeMatchPredicate = typeMatchPredicate
@@ -395,7 +395,7 @@ public void AddResolverArrayType<TElement>(TypeInfoMapping elementMapping, bool
395395
396396 void AddResolverArrayType ( TypeInfoMapping elementMapping , Type type , Func < TypeInfoMapping , PgResolverTypeInfo , PgConverterResolver > converter , Func < Type ? , bool > ? typeMatchPredicate = null , bool suppressObjectMapping = false )
397397 {
398- var arrayMapping = new TypeInfoMapping ( type , arrayDataTypeName , CreateComposedFactory ( type , elementMapping , converter ) )
398+ var arrayMapping = new TypeInfoMapping ( type , arrayDataTypeName , CreateComposedFactory ( type , elementMapping , converter , supportsReading : true ) )
399399 {
400400 MatchRequirement = elementMapping . MatchRequirement ,
401401 TypeMatchPredicate = typeMatchPredicate
@@ -487,12 +487,12 @@ void AddStructArrayType(TypeInfoMapping elementMapping, TypeInfoMapping nullable
487487 Func < Type ? , bool > ? typeMatchPredicate , Func < Type ? , bool > ? nullableTypeMatchPredicate , bool suppressObjectMapping )
488488 {
489489 var arrayDataTypeName = GetArrayDataTypeName ( elementMapping . DataTypeName ) ;
490- var arrayMapping = new TypeInfoMapping ( type , arrayDataTypeName , CreateComposedFactory ( type , elementMapping , converter ) )
490+ var arrayMapping = new TypeInfoMapping ( type , arrayDataTypeName , CreateComposedFactory ( type , elementMapping , converter , supportsReading : true ) )
491491 {
492492 MatchRequirement = elementMapping . MatchRequirement ,
493493 TypeMatchPredicate = typeMatchPredicate
494494 } ;
495- var nullableArrayMapping = new TypeInfoMapping ( nullableType , arrayDataTypeName , CreateComposedFactory ( nullableType , nullableElementMapping , nullableConverter ) )
495+ var nullableArrayMapping = new TypeInfoMapping ( nullableType , arrayDataTypeName , CreateComposedFactory ( nullableType , nullableElementMapping , nullableConverter , supportsReading : true ) )
496496 {
497497 MatchRequirement = arrayMapping . MatchRequirement ,
498498 TypeMatchPredicate = nullableTypeMatchPredicate
@@ -605,12 +605,12 @@ void AddResolverStructArrayType(TypeInfoMapping elementMapping, TypeInfoMapping
605605 {
606606 var arrayDataTypeName = GetArrayDataTypeName ( elementMapping . DataTypeName ) ;
607607
608- var arrayMapping = new TypeInfoMapping ( type , arrayDataTypeName , CreateComposedFactory ( type , elementMapping , converter ) )
608+ var arrayMapping = new TypeInfoMapping ( type , arrayDataTypeName , CreateComposedFactory ( type , elementMapping , converter , supportsReading : true ) )
609609 {
610610 MatchRequirement = elementMapping . MatchRequirement ,
611611 TypeMatchPredicate = typeMatchPredicate
612612 } ;
613- var nullableArrayMapping = new TypeInfoMapping ( nullableType , arrayDataTypeName , CreateComposedFactory ( nullableType , nullableElementMapping , nullableConverter ) )
613+ var nullableArrayMapping = new TypeInfoMapping ( nullableType , arrayDataTypeName , CreateComposedFactory ( nullableType , nullableElementMapping , nullableConverter , supportsReading : true ) )
614614 {
615615 MatchRequirement = elementMapping . MatchRequirement ,
616616 TypeMatchPredicate = nullableTypeMatchPredicate
@@ -658,7 +658,7 @@ void AddPolymorphicResolverArrayType(TypeInfoMapping elementMapping, Type type,
658658 {
659659 var arrayDataTypeName = GetArrayDataTypeName ( elementMapping . DataTypeName ) ;
660660 var mapping = new TypeInfoMapping ( type , arrayDataTypeName ,
661- CreateComposedFactory ( typeof ( Array ) , elementMapping , converter , supportsWriting : false ) )
661+ CreateComposedFactory ( typeof ( Array ) , elementMapping , converter , supportsReading : true , supportsWriting : false ) )
662662 {
663663 MatchRequirement = elementMapping . MatchRequirement ,
664664 TypeMatchPredicate = typeMatchPredicate
0 commit comments