1
+ // Copyright (c) Microsoft Corporation. All rights reserved.
2
+ // Licensed under the MIT License.
3
+
4
+ using Microsoft . TypeSpec . Generator . ClientModel . Snippets ;
5
+ using Microsoft . TypeSpec . Generator . Expressions ;
6
+ using Microsoft . TypeSpec . Generator . Primitives ;
7
+ using Microsoft . TypeSpec . Generator . Providers ;
8
+ using System ;
9
+ using System . ClientModel . Primitives ;
10
+ using System . IO ;
11
+ using System . Text . Json ;
12
+ using static Microsoft . TypeSpec . Generator . Snippets . Snippet ;
13
+
14
+ namespace Azure . Generator . Management . Providers
15
+ {
16
+ internal class ResourceSerializationProvider : TypeProvider
17
+ {
18
+ private readonly FieldProvider _dataField ;
19
+ private readonly CSharpType _resourceDataType ;
20
+ private readonly ResourceClientProvider _resoruce ;
21
+ private readonly CSharpType _jsonModelInterfaceType ;
22
+ public ResourceSerializationProvider ( ResourceClientProvider resource )
23
+ {
24
+ _resoruce = resource ;
25
+ _resourceDataType = resource . ResourceData . Type ;
26
+ _jsonModelInterfaceType = new CSharpType ( typeof ( IJsonModel < > ) , _resourceDataType ) ;
27
+ _dataField = new FieldProvider ( FieldModifiers . Private | FieldModifiers . Static , _jsonModelInterfaceType , "s_dataDeserializationInstance" , this ) ;
28
+ }
29
+
30
+ protected override string BuildName ( ) => _resoruce . Name ;
31
+
32
+ protected override string BuildRelativeFilePath ( )
33
+ => Path . Combine ( "src" , "Generated" , $ "{ Name } .Serialization.cs") ;
34
+
35
+ protected override TypeSignatureModifiers BuildDeclarationModifiers ( )
36
+ => TypeSignatureModifiers . Public | TypeSignatureModifiers . Partial ;
37
+
38
+ protected override CSharpType [ ] BuildImplements ( ) => [ _jsonModelInterfaceType ] ;
39
+
40
+ protected override FieldProvider [ ] BuildFields ( ) => [ _dataField ] ;
41
+
42
+ protected override PropertyProvider [ ] BuildProperties ( ) =>
43
+ [
44
+ new PropertyProvider ( null , MethodSignatureModifiers . Private | MethodSignatureModifiers . Static , _jsonModelInterfaceType , "DataDeserializationInstance" , new ExpressionPropertyBody ( new AssignmentExpression ( _dataField , New . Instance ( _resourceDataType ) , true ) ) , this )
45
+ ] ;
46
+
47
+ protected override MethodProvider [ ] BuildMethods ( )
48
+ {
49
+ var options = new ParameterProvider ( "options" , $ "The client options for reading and writing models.", typeof ( ModelReaderWriterOptions ) ) ;
50
+ var iModelTInterface = new CSharpType ( typeof ( IPersistableModel < > ) , _resourceDataType ) ;
51
+ var data = new ParameterProvider ( "data" , $ "The binary data to be processed.", typeof ( BinaryData ) ) ;
52
+
53
+ // void IJsonModel<T>.Write(Utf8JsonWriter writer, ModelReaderWriterOptions options)
54
+ var writer = new ParameterProvider ( "writer" , $ "The writer to serialize the model to.", typeof ( Utf8JsonWriter ) ) ;
55
+ var jsonModelWriteMethod = new MethodProvider (
56
+ new MethodSignature ( nameof ( IJsonModel < object > . Write ) , null , MethodSignatureModifiers . None , null , null , [ writer , options ] , ExplicitInterface : _jsonModelInterfaceType ) ,
57
+ // => ((IJsonModel<T>)Data).Write(writer, options);
58
+ new MemberExpression ( null , "Data" ) . CastTo ( _jsonModelInterfaceType ) . Invoke ( nameof ( IJsonModel < object > . Write ) , writer , options ) ,
59
+ this ) ;
60
+
61
+ // T IJsonModel<T>.Create(ref Utf8JsonReader reader, ModelReaderWriterOptions options)
62
+ var reader = new ParameterProvider ( "reader" , $ "The reader for deserializing the model.", typeof ( Utf8JsonReader ) , isRef : true ) ;
63
+ var jsonModelCreatemethod = new MethodProvider (
64
+ new MethodSignature ( nameof ( IJsonModel < object > . Create ) , null , MethodSignatureModifiers . None , _resourceDataType , null , [ reader , options ] , ExplicitInterface : _jsonModelInterfaceType ) ,
65
+ // => DataDeserializationInstance.Create(reader, options);
66
+ new MemberExpression ( null , "DataDeserializationInstance" ) . Invoke ( nameof ( IJsonModel < object > . Create ) , reader , options ) ,
67
+ this ) ;
68
+
69
+ // BinaryData IPersistableModel<T>.Write(ModelReaderWriterOptions options)
70
+ var persistableWriteMethod = new MethodProvider (
71
+ new MethodSignature ( nameof ( IPersistableModel < object > . Write ) , null , MethodSignatureModifiers . None , typeof ( BinaryData ) , null , [ options ] , ExplicitInterface : iModelTInterface ) ,
72
+ // => ModelReaderWriter.Write<ResourceData>(Data, options);
73
+ Static ( typeof ( ModelReaderWriter ) ) . Invoke ( "Write" , [ new MemberExpression ( null , "Data" ) , options , ModelReaderWriterContextSnippets . Default ] , [ _resourceDataType ] , false ) ,
74
+ this ) ;
75
+
76
+ // T IPersistableModel<T>.Create(BinaryData data, ModelReaderWriterOptions options)
77
+ var persistableCreateMethod = new MethodProvider (
78
+ new MethodSignature ( nameof ( IPersistableModel < object > . Create ) , null , MethodSignatureModifiers . None , _resourceDataType , null , [ data , options ] , ExplicitInterface : iModelTInterface ) ,
79
+ // => ModelReaderWriter.Read<ResourceData>(new BinaryData(reader.ValueSequence));
80
+ Static ( typeof ( ModelReaderWriter ) ) . Invoke ( "Read" , [ data , options , ModelReaderWriterContextSnippets . Default ] , [ _resourceDataType ] , false ) ,
81
+ this ) ;
82
+
83
+ // ModelReaderWriterFormat IPersistableModel<T>.GetFormatFromOptions(ModelReaderWriterOptions options)
84
+ var persistableGetFormatMethod = new MethodProvider (
85
+ new MethodSignature ( nameof ( IPersistableModel < object > . GetFormatFromOptions ) , null , MethodSignatureModifiers . None , typeof ( string ) , null , [ options ] , ExplicitInterface : iModelTInterface ) ,
86
+ // => DataDeserializationInstance.GetFormatFromOptions(options);
87
+ new MemberExpression ( null , "DataDeserializationInstance" ) . Invoke ( nameof ( IPersistableModel < object > . GetFormatFromOptions ) , options ) ,
88
+ this ) ;
89
+
90
+ return [ jsonModelWriteMethod , jsonModelCreatemethod , persistableWriteMethod , persistableCreateMethod , persistableGetFormatMethod ] ;
91
+ }
92
+ }
93
+ }
0 commit comments