5
5
ProtoTypes ,
6
6
Service ,
7
7
processTypes ,
8
+ MessageType ,
8
9
} from "../utils" ;
9
10
import { RUNTIME_MIN_CODE_GEN_SUPPORTED_VERSION } from "../runtimeCodegenCompat" ;
10
11
@@ -20,6 +21,11 @@ function writeTypes(types: ProtoTypes[]): string {
20
21
}
21
22
if ( node . type === "enum" ) {
22
23
result += `export type ${ name } = typeof ${ node . content . fullyQualifiedName } [keyof typeof ${ node . content . fullyQualifiedName } ];\n\n` ;
24
+ } else if ( node . type === "message" && node . content . isMap ) {
25
+ result += `export type ${ name } = Record<
26
+ ${ node . content . fields [ 0 ] . tsType } ,
27
+ ${ node . content . fields [ 1 ] . tsType } | undefined>;` ;
28
+ result += `\n\n` ;
23
29
} else {
24
30
result += `export interface ${ name } {\n` ;
25
31
node . content . fields . forEach (
@@ -62,26 +68,39 @@ function writeSerializers(types: ProtoTypes[], isTopLevel = true): string {
62
68
`: void`
63
69
) } {
64
70
${ node . content . fields
65
- . map (
66
- ( field ) => `\
67
- ${
68
- field . repeated
69
- ? `if (msg.${ field . name } .length > 0) {`
70
- : field . optional
71
- ? `if (msg.${ field . name } != undefined) {`
72
- : `if (msg.${ field . name } ) {`
73
- }
74
- ${
75
- field . read === "readMessage"
76
- ? `writer.${ field . write } (${ field . index } , msg.${
77
- field . name
78
- } ${ field . repeated ? printIfTypescript ( "as any" ) : "" } , ${
79
- field . tsType
80
- } .writeMessage);`
81
- : `writer.${ field . write } (${ field . index } , msg.${ field . name } );`
82
- }
83
- }`
84
- )
71
+ . map ( ( field ) => {
72
+ let res = "" ;
73
+ if ( field . repeated ) {
74
+ res += `if (msg.${ field . name } .length > 0) {` ;
75
+ } else if ( field . optional ) {
76
+ res += `if (msg.${ field . name } != undefined) {` ;
77
+ } else {
78
+ res += `if (msg.${ field . name } ) {` ;
79
+ }
80
+
81
+ if ( field . read === "readMessage" ) {
82
+ res += `writer.${ field . write } (${ field . index } , msg.${
83
+ field . name
84
+ } ${ field . repeated ? printIfTypescript ( "as any" ) : "" } , ${
85
+ field . tsType
86
+ } .writeMessage);`;
87
+ } else if ( field . read === "map" ) {
88
+ const map = node . children . find (
89
+ ( c ) => c . content . fullyQualifiedName === field . tsType
90
+ ) as MessageType ;
91
+ res += `for (const key in msg.${ field . name } ) {
92
+ writer.writeMessage(${ field . index } , {}, (_, mapWriter) => {
93
+ mapWriter.${ map . content . fields [ 0 ] . write } (1, key as any);
94
+ mapWriter.${ map . content . fields [ 1 ] . write } (2, msg.foo[key]);
95
+ });
96
+ }` ;
97
+ } else {
98
+ res += `writer.${ field . write } (${ field . index } , msg.${ field . name } );` ;
99
+ }
100
+
101
+ res += "}" ;
102
+ return res ;
103
+ } )
85
104
. join ( "\n" ) }
86
105
},
87
106
@@ -101,47 +120,76 @@ function writeSerializers(types: ProtoTypes[], isTopLevel = true): string {
101
120
": void "
102
121
) } {
103
122
${ node . content . fields
104
- . filter ( ( { repeated } ) => repeated )
105
- . map ( ( field ) => `msg.${ field . name } = [];` )
123
+ . map ( ( field ) => {
124
+ if ( field . repeated ) {
125
+ return `msg.${ field . name } = [];` ;
126
+ } else if ( field . read === "map" ) {
127
+ return `msg.${ field . name } = {};` ;
128
+ }
129
+ } )
130
+ . filter ( Boolean )
106
131
. join ( "\n" ) }
107
132
while (reader.nextField()) {
108
133
const field = reader.getFieldNumber();
109
134
switch (field) {
110
135
${ node . content . fields
111
- . map (
112
- ( field ) => `\
113
- case ${ field . index } : {
114
- ${
115
- field . read === "readMessage"
116
- ? `\
117
- const message = {};
118
- reader.readMessage(message, ${ field . tsType } .readMessage);
119
- ${
120
- field . repeated
121
- ? `msg.${ field . name } .push(message${ printIfTypescript (
122
- ` as ${ field . tsType } `
123
- ) } );`
124
- : `msg.${ field . name } = message ${ printIfTypescript (
125
- `as ${ field . tsType } `
126
- ) } ;`
127
- } `
128
- : `${
129
- field . repeated
130
- ? `msg.${ field . name } .push(reader.${ field . read } () ${
131
- field . read === "readEnum"
132
- ? printIfTypescript ( `as ${ field . tsType } ` )
133
- : ""
134
- } );`
135
- : `msg.${ field . name } = reader.${ field . read } () ${
136
- field . read === "readEnum"
137
- ? printIfTypescript ( `as ${ field . tsType } ` )
138
- : ""
139
- } ;`
140
- } `
141
- }
142
- break;
143
- }`
144
- )
136
+ . map ( ( field ) => {
137
+ let res = "" ;
138
+ res += `case ${ field . index } : {` ;
139
+ if ( field . read == "map" ) {
140
+ const map = node . children . find (
141
+ ( c ) => c . content . fullyQualifiedName === field . tsType
142
+ ) as MessageType ;
143
+ res += `reader.readMessage(undefined, () => {
144
+ let key: ${ map . content . fields [ 0 ] . tsType } ;
145
+ let value: ${ map . content . fields [ 1 ] . tsType } ;
146
+ while (reader.nextField()) {
147
+ const field = reader.getFieldNumber();
148
+ switch (field) {
149
+ case 1: {
150
+ key = reader.${ map . content . fields [ 0 ] . read } ();
151
+ break;
152
+ }
153
+ case 2: {
154
+ value = reader.${ map . content . fields [ 1 ] . read } ();
155
+ break;
156
+ }
157
+ }
158
+ }
159
+ msg.${ field . name } ![key!] = value!;
160
+ });` ;
161
+ } else if ( field . read === "readMessage" ) {
162
+ res += `
163
+ const message = {};
164
+ reader.readMessage(message, ${ field . tsType } .readMessage);
165
+ ` ;
166
+ if ( field . repeated ) {
167
+ res += `msg.${ field . name } .push(message${ printIfTypescript (
168
+ ` as ${ field . tsType } `
169
+ ) } );`;
170
+ } else {
171
+ res += `msg.${ field . name } = message ${ printIfTypescript (
172
+ `as ${ field . tsType } `
173
+ ) } ;`;
174
+ }
175
+ } else {
176
+ if ( field . repeated ) {
177
+ res += `msg.${ field . name } .push(reader.${ field . read } () ${
178
+ field . read === "readEnum"
179
+ ? printIfTypescript ( `as ${ field . tsType } ` )
180
+ : ""
181
+ } );`;
182
+ } else {
183
+ res += `msg.${ field . name } = reader.${ field . read } () ${
184
+ field . read === "readEnum"
185
+ ? printIfTypescript ( `as ${ field . tsType } ` )
186
+ : ""
187
+ } ;`;
188
+ }
189
+ }
190
+ res += "break;\n}" ;
191
+ return res ;
192
+ } )
145
193
. join ( "\n" ) }
146
194
default: {
147
195
reader.skipField();
@@ -198,8 +246,12 @@ function writeSerializers(types: ProtoTypes[], isTopLevel = true): string {
198
246
},
199
247
200
248
` ;
201
- if ( node . children . length > 0 ) {
202
- result += writeSerializers ( node . children , false ) ;
249
+ const childrenWithouMaps = node . children . filter (
250
+ ( x ) => x . type !== "message" || ! x . content . isMap
251
+ ) ;
252
+
253
+ if ( childrenWithouMaps . length > 0 ) {
254
+ result += writeSerializers ( childrenWithouMaps , false ) ;
203
255
}
204
256
result += `}${ isTopLevel ? ";" : "," } \n\n` ;
205
257
break ;
0 commit comments