typia 5.0.0-dev.20230810 → 5.0.0-dev.20230814

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (190) hide show
  1. package/lib/factories/MetadataCollection.js +1 -0
  2. package/lib/factories/MetadataCollection.js.map +1 -1
  3. package/lib/factories/MetadataFactory.js +27 -0
  4. package/lib/factories/MetadataFactory.js.map +1 -1
  5. package/lib/factories/ProtobufFactory.d.ts +0 -2
  6. package/lib/factories/ProtobufFactory.js +55 -111
  7. package/lib/factories/ProtobufFactory.js.map +1 -1
  8. package/lib/factories/StatementFactory.d.ts +1 -0
  9. package/lib/factories/StatementFactory.js +5 -0
  10. package/lib/factories/StatementFactory.js.map +1 -1
  11. package/lib/factories/internal/metadata/explore_metadata.js +3 -7
  12. package/lib/factories/internal/metadata/explore_metadata.js.map +1 -1
  13. package/lib/factories/internal/metadata/iterate_metadata_intersection.js +1 -0
  14. package/lib/factories/internal/metadata/iterate_metadata_intersection.js.map +1 -1
  15. package/lib/functional/$strlen.d.ts +1 -0
  16. package/lib/functional/$strlen.js +13 -0
  17. package/lib/functional/$strlen.js.map +1 -0
  18. package/lib/functional/Namespace.js +19 -3
  19. package/lib/functional/Namespace.js.map +1 -1
  20. package/lib/json.js +4 -4
  21. package/lib/json.js.map +1 -1
  22. package/lib/misc.js +8 -8
  23. package/lib/misc.js.map +1 -1
  24. package/lib/programmers/CheckerProgrammer.js +0 -5
  25. package/lib/programmers/CheckerProgrammer.js.map +1 -1
  26. package/lib/programmers/FeatureProgrammer.d.ts +3 -3
  27. package/lib/programmers/FeatureProgrammer.js.map +1 -1
  28. package/lib/programmers/helpers/ProtobufUtil.d.ts +5 -0
  29. package/lib/programmers/helpers/ProtobufUtil.js +82 -0
  30. package/lib/programmers/helpers/ProtobufUtil.js.map +1 -0
  31. package/lib/programmers/helpers/ProtobufWire.d.ts +25 -0
  32. package/lib/{schemas/protobuf/IProtocolMap.js → programmers/helpers/ProtobufWire.js} +1 -1
  33. package/lib/programmers/helpers/ProtobufWire.js.map +1 -0
  34. package/lib/programmers/protobuf/ProtobufEncodeProgrammer.js +253 -5
  35. package/lib/programmers/protobuf/ProtobufEncodeProgrammer.js.map +1 -1
  36. package/lib/programmers/protobuf/ProtobufMessageProgrammer.js +23 -37
  37. package/lib/programmers/protobuf/ProtobufMessageProgrammer.js.map +1 -1
  38. package/lib/programmers/protobuf/ProtobufSizeProgrammer.d.ts +5 -0
  39. package/lib/programmers/protobuf/ProtobufSizeProgrammer.js +409 -0
  40. package/lib/programmers/protobuf/ProtobufSizeProgrammer.js.map +1 -0
  41. package/lib/protobuf.js +9 -1
  42. package/lib/protobuf.js.map +1 -1
  43. package/lib/schemas/metadata/Metadata.js +11 -0
  44. package/lib/schemas/metadata/Metadata.js.map +1 -1
  45. package/lib/transformers/CallExpressionTransformer.js +26 -22
  46. package/lib/transformers/CallExpressionTransformer.js.map +1 -1
  47. package/lib/transformers/features/protobuf/CreateProtobufAssertDecodeTransformer.js +1 -1
  48. package/lib/transformers/features/protobuf/CreateProtobufAssertDecodeTransformer.js.map +1 -1
  49. package/lib/transformers/features/protobuf/CreateProtobufAssertEncodeTransformer.js +1 -1
  50. package/lib/transformers/features/protobuf/CreateProtobufAssertEncodeTransformer.js.map +1 -1
  51. package/lib/transformers/features/protobuf/CreateProtobufDecodeTransformer.js +1 -3
  52. package/lib/transformers/features/protobuf/CreateProtobufDecodeTransformer.js.map +1 -1
  53. package/lib/transformers/features/protobuf/CreateProtobufEncodeTransformer.js +1 -3
  54. package/lib/transformers/features/protobuf/CreateProtobufEncodeTransformer.js.map +1 -1
  55. package/lib/transformers/features/protobuf/CreateProtobufIsDecodeTransformer.js +1 -1
  56. package/lib/transformers/features/protobuf/CreateProtobufIsDecodeTransformer.js.map +1 -1
  57. package/lib/transformers/features/protobuf/CreateProtobufIsEncodeTransformer.js +1 -1
  58. package/lib/transformers/features/protobuf/CreateProtobufIsEncodeTransformer.js.map +1 -1
  59. package/lib/transformers/features/protobuf/CreateProtobufSizeTransformer.d.ts +3 -0
  60. package/lib/transformers/features/protobuf/CreateProtobufSizeTransformer.js +10 -0
  61. package/lib/transformers/features/protobuf/CreateProtobufSizeTransformer.js.map +1 -0
  62. package/lib/transformers/features/protobuf/CreateProtobufValidateDecodeTransformer.js +1 -1
  63. package/lib/transformers/features/protobuf/CreateProtobufValidateDecodeTransformer.js.map +1 -1
  64. package/lib/transformers/features/protobuf/CreateProtobufValidateEncodeTransformer.js +1 -1
  65. package/lib/transformers/features/protobuf/CreateProtobufValidateEncodeTransformer.js.map +1 -1
  66. package/lib/transformers/features/protobuf/ProtobufAssertDecodeTransformer.js +1 -1
  67. package/lib/transformers/features/protobuf/ProtobufAssertDecodeTransformer.js.map +1 -1
  68. package/lib/transformers/features/protobuf/ProtobufAssertEncodeTransformer.js +1 -1
  69. package/lib/transformers/features/protobuf/ProtobufAssertEncodeTransformer.js.map +1 -1
  70. package/lib/transformers/features/protobuf/ProtobufDecodeTransformer.js +1 -1
  71. package/lib/transformers/features/protobuf/ProtobufDecodeTransformer.js.map +1 -1
  72. package/lib/transformers/features/protobuf/ProtobufEncodeTransformer.js +1 -1
  73. package/lib/transformers/features/protobuf/ProtobufEncodeTransformer.js.map +1 -1
  74. package/lib/transformers/features/protobuf/ProtobufIsDecodeTransformer.js +1 -1
  75. package/lib/transformers/features/protobuf/ProtobufIsDecodeTransformer.js.map +1 -1
  76. package/lib/transformers/features/protobuf/ProtobufIsEncodeTransformer.js +1 -1
  77. package/lib/transformers/features/protobuf/ProtobufIsEncodeTransformer.js.map +1 -1
  78. package/lib/transformers/features/protobuf/ProtobufMessageTransformer.d.ts +1 -1
  79. package/lib/transformers/features/protobuf/ProtobufMessageTransformer.js +7 -7
  80. package/lib/transformers/features/protobuf/ProtobufMessageTransformer.js.map +1 -1
  81. package/lib/transformers/features/protobuf/ProtobufSizeTransformer.d.ts +3 -0
  82. package/lib/transformers/features/protobuf/ProtobufSizeTransformer.js +10 -0
  83. package/lib/transformers/features/protobuf/ProtobufSizeTransformer.js.map +1 -0
  84. package/lib/transformers/features/protobuf/ProtobufValidateDecodeTransformer.js +1 -1
  85. package/lib/transformers/features/protobuf/ProtobufValidateDecodeTransformer.js.map +1 -1
  86. package/lib/transformers/features/protobuf/ProtobufValidateEncodeTransformer.js +1 -1
  87. package/lib/transformers/features/protobuf/ProtobufValidateEncodeTransformer.js.map +1 -1
  88. package/package.json +2 -1
  89. package/src/factories/MetadataCollection.ts +5 -0
  90. package/src/factories/MetadataFactory.ts +4 -0
  91. package/src/factories/ProtobufFactory.ts +106 -90
  92. package/src/factories/StatementFactory.ts +16 -0
  93. package/src/factories/internal/metadata/explore_metadata.ts +4 -6
  94. package/src/factories/internal/metadata/iterate_metadata_intersection.ts +1 -0
  95. package/src/functional/$strlen.ts +7 -0
  96. package/src/functional/Namespace.ts +32 -17
  97. package/src/json.ts +4 -4
  98. package/src/misc.ts +8 -8
  99. package/src/programmers/CheckerProgrammer.ts +0 -9
  100. package/src/programmers/FeatureProgrammer.ts +5 -3
  101. package/src/programmers/helpers/ProtobufUtil.ts +24 -0
  102. package/src/programmers/helpers/ProtobufWire.ts +28 -0
  103. package/src/programmers/protobuf/ProtobufEncodeProgrammer.ts +446 -5
  104. package/src/programmers/protobuf/ProtobufMessageProgrammer.ts +12 -8
  105. package/src/programmers/protobuf/ProtobufSizeProgrammer.ts +716 -0
  106. package/src/protobuf.ts +29 -0
  107. package/src/schemas/metadata/Metadata.ts +26 -0
  108. package/src/transformers/CallExpressionTransformer.ts +32 -28
  109. package/src/transformers/features/protobuf/CreateProtobufAssertDecodeTransformer.ts +3 -1
  110. package/src/transformers/features/protobuf/CreateProtobufAssertEncodeTransformer.ts +3 -1
  111. package/src/transformers/features/protobuf/CreateProtobufDecodeTransformer.ts +3 -4
  112. package/src/transformers/features/protobuf/CreateProtobufEncodeTransformer.ts +3 -4
  113. package/src/transformers/features/protobuf/CreateProtobufIsDecodeTransformer.ts +3 -1
  114. package/src/transformers/features/protobuf/CreateProtobufIsEncodeTransformer.ts +3 -1
  115. package/src/transformers/features/protobuf/CreateProtobufSizeTransformer.ts +9 -0
  116. package/src/transformers/features/protobuf/CreateProtobufValidateDecodeTransformer.ts +3 -1
  117. package/src/transformers/features/protobuf/CreateProtobufValidateEncodeTransformer.ts +3 -1
  118. package/src/transformers/features/protobuf/ProtobufAssertDecodeTransformer.ts +1 -1
  119. package/src/transformers/features/protobuf/ProtobufAssertEncodeTransformer.ts +1 -1
  120. package/src/transformers/features/protobuf/ProtobufDecodeTransformer.ts +1 -1
  121. package/src/transformers/features/protobuf/ProtobufEncodeTransformer.ts +1 -1
  122. package/src/transformers/features/protobuf/ProtobufIsDecodeTransformer.ts +1 -1
  123. package/src/transformers/features/protobuf/ProtobufIsEncodeTransformer.ts +1 -1
  124. package/src/transformers/features/protobuf/ProtobufMessageTransformer.ts +3 -3
  125. package/src/transformers/features/protobuf/ProtobufSizeTransformer.ts +9 -0
  126. package/src/transformers/features/protobuf/ProtobufValidateDecodeTransformer.ts +3 -1
  127. package/src/transformers/features/protobuf/ProtobufValidateEncodeTransformer.ts +3 -1
  128. package/lib/factories/internal/protocols/ProtocolMetadataUtil.d.ts +0 -16
  129. package/lib/factories/internal/protocols/ProtocolMetadataUtil.js +0 -173
  130. package/lib/factories/internal/protocols/ProtocolMetadataUtil.js.map +0 -1
  131. package/lib/factories/internal/protocols/emplace_protocol_object.d.ts +0 -3
  132. package/lib/factories/internal/protocols/emplace_protocol_object.js +0 -47
  133. package/lib/factories/internal/protocols/emplace_protocol_object.js.map +0 -1
  134. package/lib/factories/internal/protocols/emplace_protocol_property.d.ts +0 -4
  135. package/lib/factories/internal/protocols/emplace_protocol_property.js +0 -20
  136. package/lib/factories/internal/protocols/emplace_protocol_property.js.map +0 -1
  137. package/lib/factories/internal/protocols/iterate_protocol_atomic.d.ts +0 -3
  138. package/lib/factories/internal/protocols/iterate_protocol_atomic.js +0 -69
  139. package/lib/factories/internal/protocols/iterate_protocol_atomic.js.map +0 -1
  140. package/lib/factories/internal/protocols/iterate_protocol_constant.d.ts +0 -2
  141. package/lib/factories/internal/protocols/iterate_protocol_constant.js +0 -30
  142. package/lib/factories/internal/protocols/iterate_protocol_constant.js.map +0 -1
  143. package/lib/factories/internal/protocols/iterate_protocol_main.d.ts +0 -3
  144. package/lib/factories/internal/protocols/iterate_protocol_main.js +0 -17
  145. package/lib/factories/internal/protocols/iterate_protocol_main.js.map +0 -1
  146. package/lib/factories/internal/protocols/iterate_protocol_map.d.ts +0 -4
  147. package/lib/factories/internal/protocols/iterate_protocol_map.js +0 -75
  148. package/lib/factories/internal/protocols/iterate_protocol_map.js.map +0 -1
  149. package/lib/factories/internal/protocols/iterate_protocol_metadata.d.ts +0 -5
  150. package/lib/factories/internal/protocols/iterate_protocol_metadata.js +0 -190
  151. package/lib/factories/internal/protocols/iterate_protocol_metadata.js.map +0 -1
  152. package/lib/factories/internal/protocols/iterate_protocol_native.d.ts +0 -2
  153. package/lib/factories/internal/protocols/iterate_protocol_native.js +0 -33
  154. package/lib/factories/internal/protocols/iterate_protocol_native.js.map +0 -1
  155. package/lib/factories/internal/protocols/iterate_protocol_never.d.ts +0 -1
  156. package/lib/factories/internal/protocols/iterate_protocol_never.js +0 -6
  157. package/lib/factories/internal/protocols/iterate_protocol_never.js.map +0 -1
  158. package/lib/factories/internal/protocols/iterate_protocol_object.d.ts +0 -4
  159. package/lib/factories/internal/protocols/iterate_protocol_object.js +0 -157
  160. package/lib/factories/internal/protocols/iterate_protocol_object.js.map +0 -1
  161. package/lib/factories/internal/protocols/iterate_protocol_repeated.d.ts +0 -5
  162. package/lib/factories/internal/protocols/iterate_protocol_repeated.js +0 -25
  163. package/lib/factories/internal/protocols/iterate_protocol_repeated.js.map +0 -1
  164. package/lib/factories/internal/protocols/iterate_protocol_tuple.d.ts +0 -3
  165. package/lib/factories/internal/protocols/iterate_protocol_tuple.js +0 -46
  166. package/lib/factories/internal/protocols/iterate_protocol_tuple.js.map +0 -1
  167. package/lib/schemas/protobuf/IProtocolMap.d.ts +0 -5
  168. package/lib/schemas/protobuf/IProtocolMap.js.map +0 -1
  169. package/lib/schemas/protobuf/IProtocolMessage.d.ts +0 -5
  170. package/lib/schemas/protobuf/IProtocolMessage.js +0 -3
  171. package/lib/schemas/protobuf/IProtocolMessage.js.map +0 -1
  172. package/lib/schemas/protobuf/IProtocolProperty.d.ts +0 -12
  173. package/lib/schemas/protobuf/IProtocolProperty.js +0 -3
  174. package/lib/schemas/protobuf/IProtocolProperty.js.map +0 -1
  175. package/src/factories/internal/protocols/ProtocolMetadataUtil.ts +0 -180
  176. package/src/factories/internal/protocols/emplace_protocol_object.ts +0 -25
  177. package/src/factories/internal/protocols/emplace_protocol_property.ts +0 -12
  178. package/src/factories/internal/protocols/iterate_protocol_atomic.ts +0 -34
  179. package/src/factories/internal/protocols/iterate_protocol_constant.ts +0 -27
  180. package/src/factories/internal/protocols/iterate_protocol_main.ts +0 -19
  181. package/src/factories/internal/protocols/iterate_protocol_map.ts +0 -58
  182. package/src/factories/internal/protocols/iterate_protocol_metadata.ts +0 -96
  183. package/src/factories/internal/protocols/iterate_protocol_native.ts +0 -34
  184. package/src/factories/internal/protocols/iterate_protocol_never.ts +0 -1
  185. package/src/factories/internal/protocols/iterate_protocol_object.ts +0 -110
  186. package/src/factories/internal/protocols/iterate_protocol_repeated.ts +0 -34
  187. package/src/factories/internal/protocols/iterate_protocol_tuple.ts +0 -29
  188. package/src/schemas/protobuf/IProtocolMap.ts +0 -5
  189. package/src/schemas/protobuf/IProtocolMessage.ts +0 -6
  190. package/src/schemas/protobuf/IProtocolProperty.ts +0 -13
@@ -1,19 +1,65 @@
1
1
  import ts from "typescript";
2
2
 
3
3
  import { IdentifierFactory } from "../../factories/IdentifierFactory";
4
+ import { MetadataCollection } from "../../factories/MetadataCollection";
5
+ import { ProtobufFactory } from "../../factories/ProtobufFactory";
6
+ import { StatementFactory } from "../../factories/StatementFactory";
4
7
  import { TypeFactory } from "../../factories/TypeFactory";
5
8
 
9
+ import { IJsDocTagInfo } from "../../schemas/metadata/IJsDocTagInfo";
10
+ import { IMetadataTag } from "../../schemas/metadata/IMetadataTag";
11
+ import { Metadata } from "../../schemas/metadata/Metadata";
12
+ import { MetadataArray } from "../../schemas/metadata/MetadataArray";
13
+ import { MetadataObject } from "../../schemas/metadata/MetadataObject";
14
+ import { MetadataProperty } from "../../schemas/metadata/MetadataProperty";
15
+ import { MetadataTuple } from "../../schemas/metadata/MetadataTuple";
16
+
6
17
  import { IProject } from "../../transformers/IProject";
7
18
 
19
+ import { Atomic } from "../../typings/Atomic";
20
+
21
+ import { FeatureProgrammer } from "../FeatureProgrammer";
22
+ import { IsProgrammer } from "../IsProgrammer";
23
+ import { FunctionImporter } from "../helpers/FunctionImporeter";
24
+ import { ProtobufUtil } from "../helpers/ProtobufUtil";
25
+ import { ProtobufWire } from "../helpers/ProtobufWire";
26
+ import { UnionExplorer } from "../helpers/UnionExplorer";
27
+
8
28
  export namespace ProtobufEncodeProgrammer {
9
29
  export const write =
10
30
  (project: IProject) =>
11
31
  (modulo: ts.LeftHandSideExpression) =>
12
32
  (type: ts.Type, name?: string): ts.ArrowFunction => {
13
- project;
14
- modulo;
15
- type;
16
- name;
33
+ const importer = new FunctionImporter();
34
+ const collection = new MetadataCollection();
35
+ const meta: Metadata = ProtobufFactory.metadata(modulo.getText())(
36
+ project.checker,
37
+ )(collection)(type);
38
+
39
+ // @todo
40
+ meta;
41
+ write_object_function_body;
42
+ write_map_function_body;
43
+ explore_objects;
44
+ explore_arrays;
45
+
46
+ const block: ts.Statement[] = [
47
+ StatementFactory.constant(
48
+ "writer",
49
+ ts.factory.createNewExpression(
50
+ importer.use("Writer"),
51
+ undefined,
52
+ undefined,
53
+ ),
54
+ ),
55
+ ts.factory.createReturnStatement(
56
+ ts.factory.createCallExpression(
57
+ IdentifierFactory.access(WRITER())("finish"),
58
+ undefined,
59
+ undefined,
60
+ ),
61
+ ),
62
+ ];
17
63
 
18
64
  // @todo
19
65
  return ts.factory.createArrowFunction(
@@ -30,7 +76,402 @@ export namespace ProtobufEncodeProgrammer {
30
76
  ],
31
77
  ts.factory.createTypeReferenceNode("Uint8Array"),
32
78
  undefined,
33
- ts.factory.createIdentifier("new Uint8Array()"),
79
+ ts.factory.createBlock(
80
+ [...importer.declare(modulo), ...block],
81
+ true,
82
+ ),
34
83
  );
35
84
  };
85
+
86
+ const write_object_function_body =
87
+ (project: IProject) =>
88
+ (config: FeatureProgrammer.IConfig) =>
89
+ (importer: FunctionImporter) =>
90
+ (
91
+ input: ts.Expression,
92
+ obj: MetadataObject,
93
+ explore: FeatureProgrammer.IExplore,
94
+ tags: IMetadataTag[],
95
+ ): ts.Block => {
96
+ const top: MetadataProperty = obj.properties[0]!;
97
+ if (top.key.isSoleLiteral() === false)
98
+ return write_map_function_body(project)(config)(importer)(
99
+ input,
100
+ top,
101
+ explore,
102
+ tags,
103
+ );
104
+ let index: number = 1;
105
+ return ts.factory.createBlock(
106
+ obj.properties
107
+ .map((property) => {
108
+ const statements: ts.NodeArray<ts.Statement> = decode(
109
+ project,
110
+ )(config)(importer)(index)(
111
+ input,
112
+ property.value,
113
+ explore,
114
+ property.tags,
115
+ ).statements;
116
+ index += property.value.binarySize();
117
+ return statements;
118
+ })
119
+ .flat(),
120
+ true,
121
+ );
122
+ };
123
+
124
+ const write_map_function_body =
125
+ (project: IProject) =>
126
+ (config: FeatureProgrammer.IConfig) =>
127
+ (importer: FunctionImporter) =>
128
+ (
129
+ input: ts.Expression,
130
+ entry: Metadata.Entry,
131
+ explore: FeatureProgrammer.IExplore,
132
+ tags: IMetadataTag[],
133
+ ): ts.Block => {
134
+ project;
135
+ config;
136
+ importer;
137
+ input;
138
+ entry;
139
+ explore;
140
+ tags;
141
+ return ts.factory.createBlock([], true);
142
+ };
143
+
144
+ /* -----------------------------------------------------------
145
+ DECODERS
146
+ ----------------------------------------------------------- */
147
+ const decode =
148
+ (project: IProject) =>
149
+ (config: FeatureProgrammer.IConfig) =>
150
+ (importer: FunctionImporter) =>
151
+ (index: number | null) =>
152
+ (
153
+ input: ts.Expression,
154
+ meta: Metadata,
155
+ explore: FeatureProgrammer.IExplore,
156
+ tags: IMetadataTag[],
157
+ ): ts.Block => {
158
+ // STARTS FROM ATOMIC TYPES
159
+ const unions: IUnion[] = ProtobufUtil.atomics(meta).map((type) => ({
160
+ type,
161
+ wire: () => null!,
162
+ is: () =>
163
+ ts.factory.createStrictEquality(
164
+ ts.factory.createStringLiteral(type),
165
+ ts.factory.createTypeOfExpression(input),
166
+ ),
167
+ value: () => decode_atomic(input, type, tags),
168
+ }));
169
+
170
+ project;
171
+ config;
172
+ importer;
173
+ index;
174
+ explore;
175
+ unions;
176
+
177
+ // CONSIDER ARRAYS
178
+
179
+ // CONSIDER OBJECTS
180
+
181
+ // CONSIDER MAPS
182
+
183
+ return ts.factory.createBlock([]);
184
+ };
185
+
186
+ const decode_object =
187
+ (project: IProject) =>
188
+ (config: FeatureProgrammer.IConfig) =>
189
+ (importer: FunctionImporter) =>
190
+ (
191
+ input: ts.Expression,
192
+ object: MetadataObject,
193
+ explore: FeatureProgrammer.IExplore,
194
+ ): ts.Block => {
195
+ project;
196
+ config;
197
+ importer;
198
+ input;
199
+ object;
200
+ explore;
201
+
202
+ return ts.factory.createBlock(
203
+ [].map((exp) => ts.factory.createExpressionStatement(exp)),
204
+ true,
205
+ );
206
+ };
207
+
208
+ const decode_array =
209
+ (project: IProject) =>
210
+ (config: FeatureProgrammer.IConfig) =>
211
+ (importer: FunctionImporter) =>
212
+ (index: number) =>
213
+ (
214
+ input: ts.Expression,
215
+ array: MetadataArray,
216
+ explore: FeatureProgrammer.IExplore,
217
+ tags: IMetadataTag[],
218
+ ): ts.Block =>
219
+ ts.factory.createBlock(
220
+ [
221
+ ...(index !== null
222
+ ? [
223
+ ts.factory.createExpressionStatement(
224
+ decode_tag(ProtobufWire.LEN)(index),
225
+ ),
226
+ ]
227
+ : []),
228
+ ts.factory.createForOfStatement(
229
+ undefined,
230
+ ts.factory.createVariableDeclarationList(
231
+ [ts.factory.createVariableDeclaration("elem")],
232
+ undefined,
233
+ ),
234
+ input,
235
+ decode(project)(config)(importer)(index)(
236
+ ts.factory.createIdentifier("elem"),
237
+ array.value,
238
+ explore,
239
+ tags,
240
+ ),
241
+ ),
242
+ ],
243
+ true,
244
+ );
245
+
246
+ const decode_atomic = (
247
+ input: ts.Expression,
248
+ atomic: Atomic.Literal,
249
+ tags: IMetadataTag[],
250
+ ): ts.Block => {
251
+ if (atomic === "string") return decode_bytes("string")(input);
252
+
253
+ const out = (method: string): ts.Block =>
254
+ ts.factory.createBlock(
255
+ [
256
+ ts.factory.createCallExpression(
257
+ IdentifierFactory.access(WRITER())(method),
258
+ undefined,
259
+ [input],
260
+ ),
261
+ ].map((exp) => ts.factory.createExpressionStatement(exp)),
262
+ true,
263
+ );
264
+ if (atomic === "boolean") return out("bool");
265
+
266
+ const type: IMetadataTag.INumberType | undefined = tags.find(
267
+ (tag) => tag.kind === "type",
268
+ ) as IMetadataTag.INumberType | undefined;
269
+ if (atomic === "bigint")
270
+ return out(type?.value === "uint64" ? "uint64" : "int64");
271
+ else if (type === undefined || type?.value === "double")
272
+ return out("double");
273
+ else if (type.value === "float") return out("float");
274
+ return out(
275
+ type.value === "uint32" || type.value === "uint"
276
+ ? "uint32"
277
+ : type.value === "int32" || type.value === "int"
278
+ ? "int32"
279
+ : type.value === "int64"
280
+ ? "int64"
281
+ : "uint64",
282
+ );
283
+ };
284
+
285
+ const decode_bytes =
286
+ (method: "bytes" | "string") =>
287
+ (input: ts.Expression): ts.Block =>
288
+ ts.factory.createBlock(
289
+ [
290
+ ts.factory.createCallExpression(
291
+ IdentifierFactory.access(WRITER())("uint32"),
292
+ undefined,
293
+ [IdentifierFactory.access(input)("length")],
294
+ ),
295
+ ts.factory.createCallExpression(
296
+ IdentifierFactory.access(WRITER())(method),
297
+ undefined,
298
+ [input],
299
+ ),
300
+ ].map((expr) => ts.factory.createExpressionStatement(expr)),
301
+ true,
302
+ );
303
+
304
+ const decode_tag =
305
+ (wire: ProtobufWire) =>
306
+ (index: number): ts.CallExpression =>
307
+ ts.factory.createCallExpression(
308
+ IdentifierFactory.access(WRITER())("uint32"),
309
+ undefined,
310
+ [ts.factory.createNumericLiteral((index << 3) | wire)],
311
+ );
312
+
313
+ /* -----------------------------------------------------------
314
+ EXPLORERS
315
+ ----------------------------------------------------------- */
316
+ const explore_objects =
317
+ (project: IProject) =>
318
+ (config: FeatureProgrammer.IConfig) =>
319
+ (importer: FunctionImporter) =>
320
+ (
321
+ input: ts.Expression,
322
+ meta: Metadata,
323
+ explore: FeatureProgrammer.IExplore,
324
+ ) =>
325
+ meta.objects.length === 1
326
+ ? decode_object(project)(config)(importer)(
327
+ input,
328
+ meta.objects[0]!,
329
+ explore,
330
+ )
331
+ : ts.factory.createCallExpression(
332
+ ts.factory.createIdentifier(
333
+ importer.useLocal(
334
+ `${config.prefix}u${meta.union_index!}`,
335
+ ),
336
+ ),
337
+ undefined,
338
+ FeatureProgrammer.argumentsArray(config)(explore)(input),
339
+ );
340
+
341
+ const explore_arrays =
342
+ (project: IProject) =>
343
+ (config: FeatureProgrammer.IConfig) =>
344
+ (importer: FunctionImporter) =>
345
+ (index: number) =>
346
+ (
347
+ input: ts.Expression,
348
+ elements: MetadataArray[],
349
+ explore: FeatureProgrammer.IExplore,
350
+ tags: IMetadataTag[],
351
+ ): ts.Expression =>
352
+ explore_array_like_union_types(config)(importer)(
353
+ UnionExplorer.array({
354
+ checker: IsProgrammer.decode(project)(importer),
355
+ decoder: (input, target, explore, tags) =>
356
+ ts.factory.createCallExpression(
357
+ ts.factory.createArrowFunction(
358
+ undefined,
359
+ undefined,
360
+ [],
361
+ undefined,
362
+ undefined,
363
+ decode_array(project)(config)(importer)(index)(
364
+ input,
365
+ target,
366
+ explore,
367
+ tags,
368
+ ),
369
+ ),
370
+ undefined,
371
+ undefined,
372
+ ),
373
+ empty: ts.factory.createStringLiteral("[]"),
374
+ success: ts.factory.createTrue(),
375
+ failure: (input, expected) =>
376
+ create_throw_error(importer)(expected)(input),
377
+ }),
378
+ )(input, elements, explore, tags);
379
+
380
+ const explore_array_like_union_types =
381
+ (config: FeatureProgrammer.IConfig) =>
382
+ (importer: FunctionImporter) =>
383
+ <T extends MetadataArray | MetadataTuple>(
384
+ factory: (
385
+ parameters: ts.ParameterDeclaration[],
386
+ ) => (
387
+ input: ts.Expression,
388
+ elements: T[],
389
+ explore: FeatureProgrammer.IExplore,
390
+ tags: IMetadataTag[],
391
+ jsDocTags: IJsDocTagInfo[],
392
+ ) => ts.ArrowFunction,
393
+ ) =>
394
+ (
395
+ input: ts.Expression,
396
+ elements: T[],
397
+ explore: FeatureProgrammer.IExplore,
398
+ tags: IMetadataTag[],
399
+ ): ts.Expression => {
400
+ const arrow =
401
+ (parameters: ts.ParameterDeclaration[]) =>
402
+ (explore: FeatureProgrammer.IExplore) =>
403
+ (input: ts.Expression): ts.ArrowFunction =>
404
+ factory(parameters)(input, elements, explore, tags, []);
405
+ if (elements.every((e) => e.recursive === false))
406
+ ts.factory.createCallExpression(
407
+ arrow([])(explore)(input),
408
+ undefined,
409
+ [],
410
+ );
411
+
412
+ explore = {
413
+ ...explore,
414
+ source: "function",
415
+ from: "array",
416
+ };
417
+ return ts.factory.createCallExpression(
418
+ ts.factory.createIdentifier(
419
+ importer.emplaceUnion(
420
+ config.prefix,
421
+ elements.map((e) => e.name).join(" | "),
422
+ () =>
423
+ arrow(
424
+ FeatureProgrammer.parameterDeclarations(config)(
425
+ TypeFactory.keyword("any"),
426
+ )(ts.factory.createIdentifier("input")),
427
+ )({
428
+ ...explore,
429
+ postfix: "",
430
+ })(ts.factory.createIdentifier("input")),
431
+ ),
432
+ ),
433
+ undefined,
434
+ FeatureProgrammer.argumentsArray(config)(explore)(input),
435
+ );
436
+ };
437
+
438
+ /* -----------------------------------------------------------
439
+ CONFIGURATIONS
440
+ ----------------------------------------------------------- */
441
+ // const PREFIX = "$pe";
442
+
443
+ const create_throw_error =
444
+ (importer: FunctionImporter) =>
445
+ (expected: string) =>
446
+ (value: ts.Expression) =>
447
+ ts.factory.createExpressionStatement(
448
+ ts.factory.createCallExpression(
449
+ importer.use("throws"),
450
+ [],
451
+ [
452
+ ts.factory.createObjectLiteralExpression(
453
+ [
454
+ ts.factory.createPropertyAssignment(
455
+ "expected",
456
+ ts.factory.createStringLiteral(expected),
457
+ ),
458
+ ts.factory.createPropertyAssignment(
459
+ "value",
460
+ value,
461
+ ),
462
+ ],
463
+ true,
464
+ ),
465
+ ],
466
+ ),
467
+ );
468
+ }
469
+
470
+ const WRITER = () => ts.factory.createIdentifier("writer");
471
+
472
+ interface IUnion {
473
+ type: string;
474
+ wire: () => ProtobufWire;
475
+ is: () => ts.Expression;
476
+ value: (index: number | null) => ts.Block;
36
477
  }
@@ -14,6 +14,8 @@ import { Atomic } from "../../typings/Atomic";
14
14
  import { MapUtil } from "../../utils/MapUtil";
15
15
  import { NameEncoder } from "../../utils/NameEncoder";
16
16
 
17
+ import { ProtobufUtil } from "../helpers/ProtobufUtil";
18
+
17
19
  export namespace ProtobufMessageProgrammer {
18
20
  export const write =
19
21
  ({ checker }: IProject) =>
@@ -87,27 +89,27 @@ export namespace ProtobufMessageProgrammer {
87
89
  return type.indexOf("${name}") !== -1
88
90
  ? type.replace("${name}", key)
89
91
  : `${
90
- prop.value.arrays.length || key.startsWith("map<")
92
+ prop.value.arrays.length || type.startsWith("map<")
91
93
  ? ""
92
94
  : !prop.value.isRequired() || prop.value.nullable
93
95
  ? "optional "
94
- : "required"
96
+ : "required "
95
97
  }${type} ${key} = ${++ptr.value};`;
96
98
  })
97
99
  .join("\n");
98
100
  };
99
101
 
102
+ /* -----------------------------------------------------------
103
+ DECODERS
104
+ ----------------------------------------------------------- */
100
105
  const decode =
101
106
  (ptr: IPointer<number>) =>
102
107
  (tags: IMetadataTag[]) =>
103
108
  (meta: Metadata): string => {
104
109
  const elements: Set<string> = new Set();
105
110
  if (meta.natives.length) elements.add("bytes");
106
- if (meta.templates.length) elements.add("string");
107
- for (const atomic of meta.atomics)
111
+ for (const atomic of ProtobufUtil.atomics(meta))
108
112
  elements.add(decode_atomic(tags)(atomic));
109
- for (const constant of meta.constants)
110
- elements.add(decode_atomic(tags)(constant.type));
111
113
  for (const array of meta.arrays)
112
114
  elements.add(`repeated ${decode(ptr)(tags)(array.value)}`);
113
115
  for (const obj of meta.objects)
@@ -123,8 +125,10 @@ export namespace ProtobufMessageProgrammer {
123
125
  : [
124
126
  "oneof ${name} {",
125
127
  ...[...elements].map(
126
- (str, i) =>
127
- `${TAB}${str} v${i + 1} = ${++ptr.value};`,
128
+ (str) =>
129
+ `${TAB}${str} v${
130
+ ptr.value + 1
131
+ } = ${++ptr.value};`,
128
132
  ),
129
133
  "}",
130
134
  ].join("\n");