1515using System . Net ;
1616using System . Text ;
1717using System . Text . Json ;
18+ using static Microsoft . TypeSpec . Generator . Primitives . CSharpType ;
1819using static Microsoft . TypeSpec . Generator . Snippets . Snippet ;
1920
2021namespace Azure . Generator . Primitives
2122{
2223 internal static class KnownAzureTypes
2324 {
24- public delegate MethodBodyStatement SerializationExpression ( ValueExpression value , ScopedApi < Utf8JsonWriter > writer , ScopedApi < ModelReaderWriterOptions > options , SerializationFormat format ) ;
25+ public delegate MethodBodyStatement SerializationExpression ( CSharpType valueType , ValueExpression value , ScopedApi < Utf8JsonWriter > writer , ScopedApi < ModelReaderWriterOptions > options , SerializationFormat format ) ;
2526 public delegate ValueExpression DeserializationExpression ( CSharpType valueType , ScopedApi < JsonElement > element , ScopedApi < BinaryData > data , ScopedApi < ModelReaderWriterOptions > options , SerializationFormat format ) ;
2627
2728 private const string UuidId = "Azure.Core.uuid" ;
@@ -33,19 +34,25 @@ internal static class KnownAzureTypes
3334 private const string AzureError = "Azure.Core.Foundations.Error" ;
3435 private const string EmbeddingVector = "Azure.Core.EmbeddingVector" ;
3536
36- private static MethodBodyStatement SerializeTypeWithImplicitOperatorToString ( ValueExpression value , ScopedApi < Utf8JsonWriter > writer , ScopedApi < ModelReaderWriterOptions > options , SerializationFormat format )
37- => writer . WriteStringValue ( value ) ;
37+ private static MethodBodyStatement SerializeTypeWithImplicitOperatorToString ( CSharpType valueType , ValueExpression value , ScopedApi < Utf8JsonWriter > writer , ScopedApi < ModelReaderWriterOptions > options , SerializationFormat format )
38+ {
39+ value = value . NullableStructValue ( valueType ) ;
40+ return writer . WriteStringValue ( value ) ;
41+ }
3842
3943 private static ValueExpression DeserializeNewInstanceStringLikeType ( CSharpType valueType , ScopedApi < JsonElement > element , ScopedApi < BinaryData > data , ScopedApi < ModelReaderWriterOptions > options , SerializationFormat format )
4044 => New . Instance ( valueType , element . GetString ( ) ) ;
4145
42- private static MethodBodyStatement SerializeTypeWithToString ( ValueExpression value , ScopedApi < Utf8JsonWriter > writer , ScopedApi < ModelReaderWriterOptions > options , SerializationFormat format )
43- => writer . WriteStringValue ( value . InvokeToString ( ) ) ;
46+ private static MethodBodyStatement SerializeTypeWithToString ( CSharpType valueType , ValueExpression value , ScopedApi < Utf8JsonWriter > writer , ScopedApi < ModelReaderWriterOptions > options , SerializationFormat format )
47+ {
48+ value = value . NullableStructValue ( valueType ) ;
49+ return writer . WriteStringValue ( value . InvokeToString ( ) ) ;
50+ }
4451
4552 private static ValueExpression DeserializeParsableStringLikeType ( CSharpType valueType , ScopedApi < JsonElement > element , ScopedApi < BinaryData > data , ScopedApi < ModelReaderWriterOptions > options , SerializationFormat format )
4653 => Static ( valueType ) . Invoke ( "Parse" , element . GetString ( ) ) ;
4754
48- private static MethodBodyStatement SerializeResponseError ( ValueExpression value , ScopedApi < Utf8JsonWriter > writer , ScopedApi < ModelReaderWriterOptions > options , SerializationFormat format )
55+ private static MethodBodyStatement SerializeResponseError ( CSharpType valueType , ValueExpression value , ScopedApi < Utf8JsonWriter > writer , ScopedApi < ModelReaderWriterOptions > options , SerializationFormat format )
4956 {
5057 var asJsonModel = value . CastTo ( typeof ( IJsonModel < ResponseError > ) ) ;
5158 return asJsonModel . Invoke ( nameof ( IJsonModel < ResponseError > . Write ) , writer , options ) . Terminate ( ) ;
@@ -80,7 +87,7 @@ private static ValueExpression DeserializeResponseError(
8087 [ EmbeddingVector ] = typeof ( ReadOnlyMemory < > )
8188 } ;
8289
83- private static readonly IReadOnlyDictionary < CSharpType , SerializationExpression > _typeToSerializationExpression = new Dictionary < CSharpType , SerializationExpression >
90+ private static readonly IReadOnlyDictionary < CSharpType , SerializationExpression > _typeToSerializationExpression = new Dictionary < CSharpType , SerializationExpression > ( new CSharpTypeIgnoreNullableComparer ( ) )
8491 {
8592 [ typeof ( Guid ) ] = SerializeTypeWithImplicitOperatorToString ,
8693 [ typeof ( IPAddress ) ] = SerializeTypeWithToString ,
@@ -90,7 +97,7 @@ private static ValueExpression DeserializeResponseError(
9097 [ typeof ( ResponseError ) ] = SerializeResponseError ,
9198 } ;
9299
93- private static readonly IReadOnlyDictionary < CSharpType , DeserializationExpression > _typeToDeserializationExpression = new Dictionary < CSharpType , DeserializationExpression >
100+ private static readonly IReadOnlyDictionary < CSharpType , DeserializationExpression > _typeToDeserializationExpression = new Dictionary < CSharpType , DeserializationExpression > ( new CSharpTypeIgnoreNullableComparer ( ) )
94101 {
95102 [ typeof ( Guid ) ] = DeserializeNewInstanceStringLikeType ,
96103 [ typeof ( IPAddress ) ] = DeserializeParsableStringLikeType ,
0 commit comments