@codama/renderers-rust 1.1.0 → 1.1.2
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.
- package/dist/index.node.cjs +313 -247
- package/dist/index.node.cjs.map +1 -1
- package/dist/index.node.mjs +293 -221
- package/dist/index.node.mjs.map +1 -1
- package/dist/templates/accountsPage.njk +2 -0
- package/dist/templates/instructionsPage.njk +2 -0
- package/dist/types/getRenderMapVisitor.d.ts +1 -1
- package/dist/types/getRenderMapVisitor.d.ts.map +1 -1
- package/dist/types/getTypeManifestVisitor.d.ts +1 -1
- package/dist/types/utils/discriminatorConstant.d.ts +17 -0
- package/dist/types/utils/discriminatorConstant.d.ts.map +1 -0
- package/dist/types/utils/index.d.ts +1 -0
- package/dist/types/utils/index.d.ts.map +1 -1
- package/package.json +3 -3
package/dist/index.node.cjs
CHANGED
|
@@ -111,14 +111,14 @@ var ImportMap = class _ImportMap {
|
|
|
111
111
|
|
|
112
112
|
// src/getRenderMapVisitor.ts
|
|
113
113
|
var import_errors3 = require("@codama/errors");
|
|
114
|
-
var
|
|
114
|
+
var import_nodes6 = require("@codama/nodes");
|
|
115
115
|
var import_renderers_core = require("@codama/renderers-core");
|
|
116
|
-
var
|
|
116
|
+
var import_visitors_core4 = require("@codama/visitors-core");
|
|
117
117
|
|
|
118
118
|
// src/getTypeManifestVisitor.ts
|
|
119
119
|
var import_errors2 = require("@codama/errors");
|
|
120
|
-
var
|
|
121
|
-
var
|
|
120
|
+
var import_nodes5 = require("@codama/nodes");
|
|
121
|
+
var import_visitors_core3 = require("@codama/visitors-core");
|
|
122
122
|
|
|
123
123
|
// src/utils/codecs.ts
|
|
124
124
|
var import_codecs_strings = require("@solana/codecs-strings");
|
|
@@ -136,6 +136,192 @@ function getBytesFromBytesValueNode(node) {
|
|
|
136
136
|
}
|
|
137
137
|
}
|
|
138
138
|
|
|
139
|
+
// src/utils/discriminatorConstant.ts
|
|
140
|
+
var import_nodes2 = require("@codama/nodes");
|
|
141
|
+
var import_visitors_core2 = require("@codama/visitors-core");
|
|
142
|
+
|
|
143
|
+
// src/renderValueNodeVisitor.ts
|
|
144
|
+
var import_nodes = require("@codama/nodes");
|
|
145
|
+
var import_visitors_core = require("@codama/visitors-core");
|
|
146
|
+
function renderValueNode(value, getImportFrom, useStr = false) {
|
|
147
|
+
return (0, import_visitors_core.visit)(value, renderValueNodeVisitor(getImportFrom, useStr));
|
|
148
|
+
}
|
|
149
|
+
function renderValueNodeVisitor(getImportFrom, useStr = false) {
|
|
150
|
+
return {
|
|
151
|
+
visitArrayValue(node) {
|
|
152
|
+
const list = node.items.map((v) => (0, import_visitors_core.visit)(v, this));
|
|
153
|
+
return {
|
|
154
|
+
imports: new ImportMap().mergeWith(...list.map((c) => c.imports)),
|
|
155
|
+
render: `[${list.map((c) => c.render).join(", ")}]`
|
|
156
|
+
};
|
|
157
|
+
},
|
|
158
|
+
visitBooleanValue(node) {
|
|
159
|
+
return {
|
|
160
|
+
imports: new ImportMap(),
|
|
161
|
+
render: JSON.stringify(node.boolean)
|
|
162
|
+
};
|
|
163
|
+
},
|
|
164
|
+
visitBytesValue(node) {
|
|
165
|
+
const bytes = getBytesFromBytesValueNode(node);
|
|
166
|
+
const numbers = Array.from(bytes).map(import_nodes.numberValueNode);
|
|
167
|
+
return (0, import_visitors_core.visit)((0, import_nodes.arrayValueNode)(numbers), this);
|
|
168
|
+
},
|
|
169
|
+
visitConstantValue(node) {
|
|
170
|
+
if ((0, import_nodes.isNode)(node.value, "bytesValueNode")) {
|
|
171
|
+
return (0, import_visitors_core.visit)(node.value, this);
|
|
172
|
+
}
|
|
173
|
+
if ((0, import_nodes.isNode)(node.type, "stringTypeNode") && (0, import_nodes.isNode)(node.value, "stringValueNode")) {
|
|
174
|
+
return (0, import_visitors_core.visit)((0, import_nodes.bytesValueNode)(node.type.encoding, node.value.string), this);
|
|
175
|
+
}
|
|
176
|
+
if ((0, import_nodes.isNode)(node.type, "numberTypeNode") && (0, import_nodes.isNode)(node.value, "numberValueNode")) {
|
|
177
|
+
const numberManifest = (0, import_visitors_core.visit)(node.value, this);
|
|
178
|
+
const { format, endian } = node.type;
|
|
179
|
+
const byteFunction = endian === "le" ? "to_le_bytes" : "to_be_bytes";
|
|
180
|
+
numberManifest.render = `${numberManifest.render}${format}.${byteFunction}()`;
|
|
181
|
+
return numberManifest;
|
|
182
|
+
}
|
|
183
|
+
throw new Error("Unsupported constant value type.");
|
|
184
|
+
},
|
|
185
|
+
visitEnumValue(node) {
|
|
186
|
+
const imports = new ImportMap();
|
|
187
|
+
const enumName = (0, import_nodes.pascalCase)(node.enum.name);
|
|
188
|
+
const variantName = (0, import_nodes.pascalCase)(node.variant);
|
|
189
|
+
const importFrom = getImportFrom(node.enum);
|
|
190
|
+
imports.add(`${importFrom}::${enumName}`);
|
|
191
|
+
if (!node.value) {
|
|
192
|
+
return { imports, render: `${enumName}::${variantName}` };
|
|
193
|
+
}
|
|
194
|
+
const enumValue = (0, import_visitors_core.visit)(node.value, this);
|
|
195
|
+
const fields = enumValue.render;
|
|
196
|
+
return {
|
|
197
|
+
imports: imports.mergeWith(enumValue.imports),
|
|
198
|
+
render: `${enumName}::${variantName} ${fields}`
|
|
199
|
+
};
|
|
200
|
+
},
|
|
201
|
+
visitMapEntryValue(node) {
|
|
202
|
+
const mapKey = (0, import_visitors_core.visit)(node.key, this);
|
|
203
|
+
const mapValue = (0, import_visitors_core.visit)(node.value, this);
|
|
204
|
+
return {
|
|
205
|
+
imports: mapKey.imports.mergeWith(mapValue.imports),
|
|
206
|
+
render: `[${mapKey.render}, ${mapValue.render}]`
|
|
207
|
+
};
|
|
208
|
+
},
|
|
209
|
+
visitMapValue(node) {
|
|
210
|
+
const map = node.entries.map((entry) => (0, import_visitors_core.visit)(entry, this));
|
|
211
|
+
const imports = new ImportMap().add("std::collection::HashMap");
|
|
212
|
+
return {
|
|
213
|
+
imports: imports.mergeWith(...map.map((c) => c.imports)),
|
|
214
|
+
render: `HashMap::from([${map.map((c) => c.render).join(", ")}])`
|
|
215
|
+
};
|
|
216
|
+
},
|
|
217
|
+
visitNoneValue() {
|
|
218
|
+
return {
|
|
219
|
+
imports: new ImportMap(),
|
|
220
|
+
render: "None"
|
|
221
|
+
};
|
|
222
|
+
},
|
|
223
|
+
visitNumberValue(node) {
|
|
224
|
+
return {
|
|
225
|
+
imports: new ImportMap(),
|
|
226
|
+
render: node.number.toString()
|
|
227
|
+
};
|
|
228
|
+
},
|
|
229
|
+
visitPublicKeyValue(node) {
|
|
230
|
+
return {
|
|
231
|
+
imports: new ImportMap().add("solana_pubkey"),
|
|
232
|
+
render: `pubkey!("${node.publicKey}")`
|
|
233
|
+
};
|
|
234
|
+
},
|
|
235
|
+
visitSetValue(node) {
|
|
236
|
+
const set = node.items.map((v) => (0, import_visitors_core.visit)(v, this));
|
|
237
|
+
const imports = new ImportMap().add("std::collection::HashSet");
|
|
238
|
+
return {
|
|
239
|
+
imports: imports.mergeWith(...set.map((c) => c.imports)),
|
|
240
|
+
render: `HashSet::from([${set.map((c) => c.render).join(", ")}])`
|
|
241
|
+
};
|
|
242
|
+
},
|
|
243
|
+
visitSomeValue(node) {
|
|
244
|
+
const child = (0, import_visitors_core.visit)(node.value, this);
|
|
245
|
+
return {
|
|
246
|
+
...child,
|
|
247
|
+
render: `Some(${child.render})`
|
|
248
|
+
};
|
|
249
|
+
},
|
|
250
|
+
visitStringValue(node) {
|
|
251
|
+
return {
|
|
252
|
+
imports: new ImportMap(),
|
|
253
|
+
render: useStr ? `${JSON.stringify(node.string)}` : `String::from(${JSON.stringify(node.string)})`
|
|
254
|
+
};
|
|
255
|
+
},
|
|
256
|
+
visitStructFieldValue(node) {
|
|
257
|
+
const structValue = (0, import_visitors_core.visit)(node.value, this);
|
|
258
|
+
return {
|
|
259
|
+
imports: structValue.imports,
|
|
260
|
+
render: `${node.name}: ${structValue.render}`
|
|
261
|
+
};
|
|
262
|
+
},
|
|
263
|
+
visitStructValue(node) {
|
|
264
|
+
const struct = node.fields.map((field) => (0, import_visitors_core.visit)(field, this));
|
|
265
|
+
return {
|
|
266
|
+
imports: new ImportMap().mergeWith(...struct.map((c) => c.imports)),
|
|
267
|
+
render: `{ ${struct.map((c) => c.render).join(", ")} }`
|
|
268
|
+
};
|
|
269
|
+
},
|
|
270
|
+
visitTupleValue(node) {
|
|
271
|
+
const tuple = node.items.map((v) => (0, import_visitors_core.visit)(v, this));
|
|
272
|
+
return {
|
|
273
|
+
imports: new ImportMap().mergeWith(...tuple.map((c) => c.imports)),
|
|
274
|
+
render: `(${tuple.map((c) => c.render).join(", ")})`
|
|
275
|
+
};
|
|
276
|
+
}
|
|
277
|
+
};
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
// src/utils/discriminatorConstant.ts
|
|
281
|
+
function mergeFragments(fragments, merge) {
|
|
282
|
+
const imports = fragments.reduce((acc, frag) => acc.mergeWith(frag.imports), new ImportMap());
|
|
283
|
+
const render2 = merge(fragments.map((frag) => frag.render));
|
|
284
|
+
return { imports, render: render2 };
|
|
285
|
+
}
|
|
286
|
+
function getDiscriminatorConstants(scope) {
|
|
287
|
+
const fragments = scope.discriminatorNodes.map((node) => getDiscriminatorConstant(node, scope)).filter(Boolean);
|
|
288
|
+
return mergeFragments(fragments, (r) => r.join("\n\n"));
|
|
289
|
+
}
|
|
290
|
+
function getDiscriminatorConstant(discriminatorNode, scope) {
|
|
291
|
+
switch (discriminatorNode.kind) {
|
|
292
|
+
case "constantDiscriminatorNode":
|
|
293
|
+
return getConstantDiscriminatorConstant(discriminatorNode, scope);
|
|
294
|
+
case "fieldDiscriminatorNode":
|
|
295
|
+
return getFieldDiscriminatorConstant(discriminatorNode, scope);
|
|
296
|
+
default:
|
|
297
|
+
return null;
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
function getConstantDiscriminatorConstant(discriminatorNode, scope) {
|
|
301
|
+
const { discriminatorNodes, getImportFrom, prefix, typeManifestVisitor } = scope;
|
|
302
|
+
const index = discriminatorNodes.filter((0, import_nodes2.isNodeFilter)("constantDiscriminatorNode")).indexOf(discriminatorNode);
|
|
303
|
+
const suffix = index <= 0 ? "" : `_${index + 1}`;
|
|
304
|
+
const name = (0, import_nodes2.camelCase)(`${prefix}_discriminator${suffix}`);
|
|
305
|
+
const typeManifest = (0, import_visitors_core2.visit)(discriminatorNode.constant.type, typeManifestVisitor);
|
|
306
|
+
const value = renderValueNode(discriminatorNode.constant.value, getImportFrom);
|
|
307
|
+
return getConstant(name, typeManifest, value);
|
|
308
|
+
}
|
|
309
|
+
function getFieldDiscriminatorConstant(discriminatorNode, scope) {
|
|
310
|
+
const { fields, prefix, getImportFrom, typeManifestVisitor } = scope;
|
|
311
|
+
const field = fields.find((f) => f.name === discriminatorNode.name);
|
|
312
|
+
if (!field || !field.defaultValue || !(0, import_nodes2.isNode)(field.defaultValue, import_nodes2.VALUE_NODES)) {
|
|
313
|
+
return null;
|
|
314
|
+
}
|
|
315
|
+
const name = (0, import_nodes2.camelCase)(`${prefix}_${discriminatorNode.name}`);
|
|
316
|
+
const typeManifest = (0, import_visitors_core2.visit)(field.type, typeManifestVisitor);
|
|
317
|
+
const value = renderValueNode(field.defaultValue, getImportFrom);
|
|
318
|
+
return getConstant(name, typeManifest, value);
|
|
319
|
+
}
|
|
320
|
+
function getConstant(name, typeManifest, value) {
|
|
321
|
+
const type = { imports: typeManifest.imports, render: typeManifest.type };
|
|
322
|
+
return mergeFragments([type, value], ([t, v]) => `pub const ${(0, import_nodes2.snakeCase)(name).toUpperCase()}: ${t} = ${v};`);
|
|
323
|
+
}
|
|
324
|
+
|
|
139
325
|
// src/utils/linkOverrides.ts
|
|
140
326
|
var import_errors = require("@codama/errors");
|
|
141
327
|
function getImportFromFactory(overrides) {
|
|
@@ -182,7 +368,7 @@ function getImportFromFactory(overrides) {
|
|
|
182
368
|
// src/utils/render.ts
|
|
183
369
|
var import_node_path = require("path");
|
|
184
370
|
var import_node_url = require("url");
|
|
185
|
-
var
|
|
371
|
+
var import_nodes3 = require("@codama/nodes");
|
|
186
372
|
var import_nunjucks = __toESM(require("nunjucks"));
|
|
187
373
|
function rustDocblock(docs) {
|
|
188
374
|
if (docs.length <= 0) return "";
|
|
@@ -194,17 +380,17 @@ var render = (template, context, options) => {
|
|
|
194
380
|
const dirname = false ? pathDirname(fileURLToPath(import_meta.url)) : __dirname;
|
|
195
381
|
const templates = false ? (0, import_node_path.join)(dirname, "..", "..", "public", "templates") : (0, import_node_path.join)(dirname, "templates");
|
|
196
382
|
const env = import_nunjucks.default.configure(templates, { autoescape: false, trimBlocks: true, ...options });
|
|
197
|
-
env.addFilter("pascalCase",
|
|
198
|
-
env.addFilter("camelCase",
|
|
199
|
-
env.addFilter("snakeCase",
|
|
200
|
-
env.addFilter("kebabCase",
|
|
201
|
-
env.addFilter("titleCase",
|
|
383
|
+
env.addFilter("pascalCase", import_nodes3.pascalCase);
|
|
384
|
+
env.addFilter("camelCase", import_nodes3.camelCase);
|
|
385
|
+
env.addFilter("snakeCase", import_nodes3.snakeCase);
|
|
386
|
+
env.addFilter("kebabCase", import_nodes3.kebabCase);
|
|
387
|
+
env.addFilter("titleCase", import_nodes3.titleCase);
|
|
202
388
|
env.addFilter("rustDocblock", rustDocblock);
|
|
203
389
|
return env.render(template, context);
|
|
204
390
|
};
|
|
205
391
|
|
|
206
392
|
// src/utils/traitOptions.ts
|
|
207
|
-
var
|
|
393
|
+
var import_nodes4 = require("@codama/nodes");
|
|
208
394
|
var DEFAULT_TRAIT_OPTIONS = {
|
|
209
395
|
baseDefaults: [
|
|
210
396
|
"borsh::BorshSerialize",
|
|
@@ -227,14 +413,14 @@ function getTraitsFromNodeFactory(options = {}) {
|
|
|
227
413
|
return (node) => getTraitsFromNode(node, options);
|
|
228
414
|
}
|
|
229
415
|
function getTraitsFromNode(node, userOptions = {}) {
|
|
230
|
-
(0,
|
|
416
|
+
(0, import_nodes4.assertIsNode)(node, ["accountNode", "definedTypeNode", "instructionNode"]);
|
|
231
417
|
const options = { ...DEFAULT_TRAIT_OPTIONS, ...userOptions };
|
|
232
418
|
const nodeType = getNodeType(node);
|
|
233
419
|
if (nodeType === "alias") {
|
|
234
420
|
return { imports: new ImportMap(), render: "" };
|
|
235
421
|
}
|
|
236
422
|
const sanitizedOverrides = Object.fromEntries(
|
|
237
|
-
Object.entries(options.overrides).map(([key, value]) => [(0,
|
|
423
|
+
Object.entries(options.overrides).map(([key, value]) => [(0, import_nodes4.camelCase)(key), value])
|
|
238
424
|
);
|
|
239
425
|
const nodeOverrides = sanitizedOverrides[node.name];
|
|
240
426
|
const allTraits = nodeOverrides === void 0 ? getDefaultTraits(nodeType, options) : nodeOverrides;
|
|
@@ -256,10 +442,10 @@ function getTraitsFromNode(node, userOptions = {}) {
|
|
|
256
442
|
return { imports, render: traitLines.join("") };
|
|
257
443
|
}
|
|
258
444
|
function getNodeType(node) {
|
|
259
|
-
if ((0,
|
|
260
|
-
if ((0,
|
|
261
|
-
if ((0,
|
|
262
|
-
return (0,
|
|
445
|
+
if ((0, import_nodes4.isNode)(node, ["accountNode", "instructionNode"])) return "struct";
|
|
446
|
+
if ((0, import_nodes4.isNode)(node.type, "structTypeNode")) return "struct";
|
|
447
|
+
if ((0, import_nodes4.isNode)(node.type, "enumTypeNode")) {
|
|
448
|
+
return (0, import_nodes4.isScalarEnum)(node.type) ? "scalarEnum" : "dataEnum";
|
|
263
449
|
}
|
|
264
450
|
return "alias";
|
|
265
451
|
}
|
|
@@ -312,19 +498,19 @@ function getTypeManifestVisitor(options) {
|
|
|
312
498
|
let nestedStruct = options.nestedStruct ?? false;
|
|
313
499
|
let inlineStruct = false;
|
|
314
500
|
let parentSize = null;
|
|
315
|
-
return (0,
|
|
316
|
-
(0,
|
|
501
|
+
return (0, import_visitors_core3.pipe)(
|
|
502
|
+
(0, import_visitors_core3.mergeVisitor)(
|
|
317
503
|
() => ({ imports: new ImportMap(), nestedStructs: [], type: "" }),
|
|
318
504
|
(_, values) => ({
|
|
319
505
|
...mergeManifests(values),
|
|
320
506
|
type: values.map((v) => v.type).join("\n")
|
|
321
507
|
}),
|
|
322
|
-
{ keys: [...
|
|
508
|
+
{ keys: [...import_nodes5.REGISTERED_TYPE_NODE_KINDS, "definedTypeLinkNode", "definedTypeNode", "accountNode"] }
|
|
323
509
|
),
|
|
324
|
-
(v) => (0,
|
|
510
|
+
(v) => (0, import_visitors_core3.extendVisitor)(v, {
|
|
325
511
|
visitAccount(account, { self }) {
|
|
326
|
-
parentName = (0,
|
|
327
|
-
const manifest = (0,
|
|
512
|
+
parentName = (0, import_nodes5.pascalCase)(account.name);
|
|
513
|
+
const manifest = (0, import_visitors_core3.visit)(account.data, self);
|
|
328
514
|
const traits = getTraitsFromNode2(account);
|
|
329
515
|
manifest.imports.mergeWith(traits.imports);
|
|
330
516
|
parentName = null;
|
|
@@ -334,21 +520,21 @@ function getTypeManifestVisitor(options) {
|
|
|
334
520
|
};
|
|
335
521
|
},
|
|
336
522
|
visitArrayType(arrayType, { self }) {
|
|
337
|
-
const childManifest = (0,
|
|
338
|
-
if ((0,
|
|
523
|
+
const childManifest = (0, import_visitors_core3.visit)(arrayType.item, self);
|
|
524
|
+
if ((0, import_nodes5.isNode)(arrayType.count, "fixedCountNode")) {
|
|
339
525
|
return {
|
|
340
526
|
...childManifest,
|
|
341
527
|
type: `[${childManifest.type}; ${arrayType.count.value}]`
|
|
342
528
|
};
|
|
343
529
|
}
|
|
344
|
-
if ((0,
|
|
530
|
+
if ((0, import_nodes5.isNode)(arrayType.count, "remainderCountNode")) {
|
|
345
531
|
childManifest.imports.add("kaigan::types::RemainderVec");
|
|
346
532
|
return {
|
|
347
533
|
...childManifest,
|
|
348
534
|
type: `RemainderVec<${childManifest.type}>`
|
|
349
535
|
};
|
|
350
536
|
}
|
|
351
|
-
const prefix = (0,
|
|
537
|
+
const prefix = (0, import_nodes5.resolveNestedTypeNode)(arrayType.count.prefix);
|
|
352
538
|
if (prefix.endian === "le") {
|
|
353
539
|
switch (prefix.format) {
|
|
354
540
|
case "u32":
|
|
@@ -380,7 +566,7 @@ function getTypeManifestVisitor(options) {
|
|
|
380
566
|
throw new Error("Array size not supported by Borsh");
|
|
381
567
|
},
|
|
382
568
|
visitBooleanType(booleanType) {
|
|
383
|
-
const resolvedSize = (0,
|
|
569
|
+
const resolvedSize = (0, import_nodes5.resolveNestedTypeNode)(booleanType.size);
|
|
384
570
|
if (resolvedSize.format === "u8" && resolvedSize.endian === "le") {
|
|
385
571
|
return {
|
|
386
572
|
imports: new ImportMap(),
|
|
@@ -391,26 +577,26 @@ function getTypeManifestVisitor(options) {
|
|
|
391
577
|
throw new Error("Bool size not supported by Borsh");
|
|
392
578
|
},
|
|
393
579
|
visitBytesType(_bytesType, { self }) {
|
|
394
|
-
let arraySize = (0,
|
|
580
|
+
let arraySize = (0, import_nodes5.remainderCountNode)();
|
|
395
581
|
if (typeof parentSize === "number") {
|
|
396
|
-
arraySize = (0,
|
|
582
|
+
arraySize = (0, import_nodes5.fixedCountNode)(parentSize);
|
|
397
583
|
} else if (parentSize && typeof parentSize === "object") {
|
|
398
|
-
arraySize = (0,
|
|
584
|
+
arraySize = (0, import_nodes5.prefixedCountNode)(parentSize);
|
|
399
585
|
}
|
|
400
|
-
const arrayType = (0,
|
|
401
|
-
return (0,
|
|
586
|
+
const arrayType = (0, import_nodes5.arrayTypeNode)((0, import_nodes5.numberTypeNode)("u8"), arraySize);
|
|
587
|
+
return (0, import_visitors_core3.visit)(arrayType, self);
|
|
402
588
|
},
|
|
403
589
|
visitDefinedType(definedType, { self }) {
|
|
404
|
-
parentName = (0,
|
|
405
|
-
const manifest = (0,
|
|
590
|
+
parentName = (0, import_nodes5.pascalCase)(definedType.name);
|
|
591
|
+
const manifest = (0, import_visitors_core3.visit)(definedType.type, self);
|
|
406
592
|
const traits = getTraitsFromNode2(definedType);
|
|
407
593
|
manifest.imports.mergeWith(traits.imports);
|
|
408
594
|
parentName = null;
|
|
409
|
-
const renderedType = (0,
|
|
595
|
+
const renderedType = (0, import_nodes5.isNode)(definedType.type, ["enumTypeNode", "structTypeNode"]) ? manifest.type : `pub type ${(0, import_nodes5.pascalCase)(definedType.name)} = ${manifest.type};`;
|
|
410
596
|
return { ...manifest, type: `${traits.render}${renderedType}` };
|
|
411
597
|
},
|
|
412
598
|
visitDefinedTypeLink(node) {
|
|
413
|
-
const pascalCaseDefinedType = (0,
|
|
599
|
+
const pascalCaseDefinedType = (0, import_nodes5.pascalCase)(node.name);
|
|
414
600
|
const importFrom = getImportFrom(node);
|
|
415
601
|
return {
|
|
416
602
|
imports: new ImportMap().add(`${importFrom}::${pascalCaseDefinedType}`),
|
|
@@ -419,7 +605,7 @@ function getTypeManifestVisitor(options) {
|
|
|
419
605
|
};
|
|
420
606
|
},
|
|
421
607
|
visitEnumEmptyVariantType(enumEmptyVariantType) {
|
|
422
|
-
const name = (0,
|
|
608
|
+
const name = (0, import_nodes5.pascalCase)(enumEmptyVariantType.name);
|
|
423
609
|
return {
|
|
424
610
|
imports: new ImportMap(),
|
|
425
611
|
nestedStructs: [],
|
|
@@ -427,14 +613,14 @@ function getTypeManifestVisitor(options) {
|
|
|
427
613
|
};
|
|
428
614
|
},
|
|
429
615
|
visitEnumStructVariantType(enumStructVariantType, { self }) {
|
|
430
|
-
const name = (0,
|
|
616
|
+
const name = (0, import_nodes5.pascalCase)(enumStructVariantType.name);
|
|
431
617
|
const originalParentName = parentName;
|
|
432
618
|
if (!originalParentName) {
|
|
433
619
|
throw new Error("Enum struct variant type must have a parent name.");
|
|
434
620
|
}
|
|
435
621
|
inlineStruct = true;
|
|
436
|
-
parentName = (0,
|
|
437
|
-
const typeManifest = (0,
|
|
622
|
+
parentName = (0, import_nodes5.pascalCase)(originalParentName) + name;
|
|
623
|
+
const typeManifest = (0, import_visitors_core3.visit)(enumStructVariantType.struct, self);
|
|
438
624
|
inlineStruct = false;
|
|
439
625
|
parentName = originalParentName;
|
|
440
626
|
return {
|
|
@@ -443,13 +629,13 @@ function getTypeManifestVisitor(options) {
|
|
|
443
629
|
};
|
|
444
630
|
},
|
|
445
631
|
visitEnumTupleVariantType(enumTupleVariantType, { self }) {
|
|
446
|
-
const name = (0,
|
|
632
|
+
const name = (0, import_nodes5.pascalCase)(enumTupleVariantType.name);
|
|
447
633
|
const originalParentName = parentName;
|
|
448
634
|
if (!originalParentName) {
|
|
449
635
|
throw new Error("Enum struct variant type must have a parent name.");
|
|
450
636
|
}
|
|
451
|
-
parentName = (0,
|
|
452
|
-
const childManifest = (0,
|
|
637
|
+
parentName = (0, import_nodes5.pascalCase)(originalParentName) + name;
|
|
638
|
+
const childManifest = (0, import_visitors_core3.visit)(enumTupleVariantType.tuple, self);
|
|
453
639
|
parentName = originalParentName;
|
|
454
640
|
let derive = "";
|
|
455
641
|
if (childManifest.type === "(Pubkey)") {
|
|
@@ -467,25 +653,25 @@ function getTypeManifestVisitor(options) {
|
|
|
467
653
|
if (!originalParentName) {
|
|
468
654
|
throw new Error("Enum type must have a parent name.");
|
|
469
655
|
}
|
|
470
|
-
const variants = enumType.variants.map((variant) => (0,
|
|
656
|
+
const variants = enumType.variants.map((variant) => (0, import_visitors_core3.visit)(variant, self));
|
|
471
657
|
const variantNames = variants.map((variant) => variant.type).join("\n");
|
|
472
658
|
const mergedManifest = mergeManifests(variants);
|
|
473
659
|
return {
|
|
474
660
|
...mergedManifest,
|
|
475
|
-
type: `pub enum ${(0,
|
|
661
|
+
type: `pub enum ${(0, import_nodes5.pascalCase)(originalParentName)} {
|
|
476
662
|
${variantNames}
|
|
477
663
|
}`
|
|
478
664
|
};
|
|
479
665
|
},
|
|
480
666
|
visitFixedSizeType(fixedSizeType, { self }) {
|
|
481
667
|
parentSize = fixedSizeType.size;
|
|
482
|
-
const manifest = (0,
|
|
668
|
+
const manifest = (0, import_visitors_core3.visit)(fixedSizeType.type, self);
|
|
483
669
|
parentSize = null;
|
|
484
670
|
return manifest;
|
|
485
671
|
},
|
|
486
672
|
visitMapType(mapType, { self }) {
|
|
487
|
-
const key = (0,
|
|
488
|
-
const value = (0,
|
|
673
|
+
const key = (0, import_visitors_core3.visit)(mapType.key, self);
|
|
674
|
+
const value = (0, import_visitors_core3.visit)(mapType.value, self);
|
|
489
675
|
const mergedManifest = mergeManifests([key, value]);
|
|
490
676
|
mergedManifest.imports.add("std::collections::HashMap");
|
|
491
677
|
return {
|
|
@@ -511,8 +697,8 @@ ${variantNames}
|
|
|
511
697
|
};
|
|
512
698
|
},
|
|
513
699
|
visitOptionType(optionType, { self }) {
|
|
514
|
-
const childManifest = (0,
|
|
515
|
-
const optionPrefix = (0,
|
|
700
|
+
const childManifest = (0, import_visitors_core3.visit)(optionType.item, self);
|
|
701
|
+
const optionPrefix = (0, import_nodes5.resolveNestedTypeNode)(optionType.prefix);
|
|
516
702
|
if (optionPrefix.format === "u8" && optionPrefix.endian === "le") {
|
|
517
703
|
return {
|
|
518
704
|
...childManifest,
|
|
@@ -532,7 +718,7 @@ ${variantNames}
|
|
|
532
718
|
throw new import_errors2.CodamaError(import_errors2.CODAMA_ERROR__RENDERERS__UNSUPPORTED_NODE, { kind: node.kind, node });
|
|
533
719
|
},
|
|
534
720
|
visitSetType(setType, { self }) {
|
|
535
|
-
const childManifest = (0,
|
|
721
|
+
const childManifest = (0, import_visitors_core3.visit)(setType.item, self);
|
|
536
722
|
childManifest.imports.add("std::collections::HashSet");
|
|
537
723
|
return {
|
|
538
724
|
...childManifest,
|
|
@@ -540,8 +726,8 @@ ${variantNames}
|
|
|
540
726
|
};
|
|
541
727
|
},
|
|
542
728
|
visitSizePrefixType(sizePrefixType, { self }) {
|
|
543
|
-
parentSize = (0,
|
|
544
|
-
const manifest = (0,
|
|
729
|
+
parentSize = (0, import_nodes5.resolveNestedTypeNode)(sizePrefixType.prefix);
|
|
730
|
+
const manifest = (0, import_visitors_core3.visit)(sizePrefixType.type, self);
|
|
545
731
|
parentSize = null;
|
|
546
732
|
return manifest;
|
|
547
733
|
},
|
|
@@ -560,7 +746,7 @@ ${variantNames}
|
|
|
560
746
|
type: `[u8; ${parentSize}]`
|
|
561
747
|
};
|
|
562
748
|
}
|
|
563
|
-
if ((0,
|
|
749
|
+
if ((0, import_nodes5.isNode)(parentSize, "numberTypeNode") && parentSize.endian === "le") {
|
|
564
750
|
switch (parentSize.format) {
|
|
565
751
|
case "u32":
|
|
566
752
|
return {
|
|
@@ -591,24 +777,24 @@ ${variantNames}
|
|
|
591
777
|
if (!originalParentName) {
|
|
592
778
|
throw new Error("Struct field type must have a parent name.");
|
|
593
779
|
}
|
|
594
|
-
parentName = (0,
|
|
780
|
+
parentName = (0, import_nodes5.pascalCase)(originalParentName) + (0, import_nodes5.pascalCase)(structFieldType.name);
|
|
595
781
|
nestedStruct = true;
|
|
596
782
|
inlineStruct = false;
|
|
597
|
-
const fieldManifest = (0,
|
|
783
|
+
const fieldManifest = (0, import_visitors_core3.visit)(structFieldType.type, self);
|
|
598
784
|
parentName = originalParentName;
|
|
599
785
|
inlineStruct = originalInlineStruct;
|
|
600
786
|
nestedStruct = originalNestedStruct;
|
|
601
|
-
const fieldName = (0,
|
|
602
|
-
const docblock = rustDocblock((0,
|
|
603
|
-
const resolvedNestedType = (0,
|
|
787
|
+
const fieldName = (0, import_nodes5.snakeCase)(structFieldType.name);
|
|
788
|
+
const docblock = rustDocblock((0, import_nodes5.parseDocs)(structFieldType.docs));
|
|
789
|
+
const resolvedNestedType = (0, import_nodes5.resolveNestedTypeNode)(structFieldType.type);
|
|
604
790
|
let derive = "";
|
|
605
791
|
if (fieldManifest.type === "Pubkey") {
|
|
606
792
|
derive = '#[cfg_attr(feature = "serde", serde(with = "serde_with::As::<serde_with::DisplayFromStr>"))]\n';
|
|
607
793
|
} else if (fieldManifest.type === "Vec<Pubkey>") {
|
|
608
794
|
derive = '#[cfg_attr(feature = "serde", serde(with = "serde_with::As::<Vec<serde_with::DisplayFromStr>>"))]\n';
|
|
609
|
-
} else if ((0,
|
|
795
|
+
} else if ((0, import_nodes5.isNode)(resolvedNestedType, "arrayTypeNode") && (0, import_nodes5.isNode)(resolvedNestedType.count, "fixedCountNode") && resolvedNestedType.count.value > 32) {
|
|
610
796
|
derive = '#[cfg_attr(feature = "serde", serde(with = "serde_big_array::BigArray"))]\n';
|
|
611
|
-
} else if ((0,
|
|
797
|
+
} else if ((0, import_nodes5.isNode)(resolvedNestedType, ["bytesTypeNode", "stringTypeNode"]) && (0, import_nodes5.isNode)(structFieldType.type, "fixedSizeTypeNode") && structFieldType.type.size > 32) {
|
|
612
798
|
derive = '#[cfg_attr(feature = "serde", serde(with = "serde_with::As::<serde_with::Bytes>"))]\n';
|
|
613
799
|
}
|
|
614
800
|
return {
|
|
@@ -621,23 +807,23 @@ ${variantNames}
|
|
|
621
807
|
if (!originalParentName) {
|
|
622
808
|
throw new Error("Struct type must have a parent name.");
|
|
623
809
|
}
|
|
624
|
-
const fields = structType.fields.map((field) => (0,
|
|
810
|
+
const fields = structType.fields.map((field) => (0, import_visitors_core3.visit)(field, self));
|
|
625
811
|
const fieldTypes = fields.map((field) => field.type).join("\n");
|
|
626
812
|
const mergedManifest = mergeManifests(fields);
|
|
627
813
|
if (nestedStruct) {
|
|
628
814
|
const nestedTraits = getTraitsFromNode2(
|
|
629
|
-
(0,
|
|
815
|
+
(0, import_nodes5.definedTypeNode)({ name: originalParentName, type: structType })
|
|
630
816
|
);
|
|
631
817
|
mergedManifest.imports.mergeWith(nestedTraits.imports);
|
|
632
818
|
return {
|
|
633
819
|
...mergedManifest,
|
|
634
820
|
nestedStructs: [
|
|
635
821
|
...mergedManifest.nestedStructs,
|
|
636
|
-
`${nestedTraits.render}pub struct ${(0,
|
|
822
|
+
`${nestedTraits.render}pub struct ${(0, import_nodes5.pascalCase)(originalParentName)} {
|
|
637
823
|
${fieldTypes}
|
|
638
824
|
}`
|
|
639
825
|
],
|
|
640
|
-
type: (0,
|
|
826
|
+
type: (0, import_nodes5.pascalCase)(originalParentName)
|
|
641
827
|
};
|
|
642
828
|
}
|
|
643
829
|
if (inlineStruct) {
|
|
@@ -647,13 +833,13 @@ ${fieldTypes}
|
|
|
647
833
|
}
|
|
648
834
|
return {
|
|
649
835
|
...mergedManifest,
|
|
650
|
-
type: `pub struct ${(0,
|
|
836
|
+
type: `pub struct ${(0, import_nodes5.pascalCase)(originalParentName)} {
|
|
651
837
|
${fieldTypes}
|
|
652
838
|
}`
|
|
653
839
|
};
|
|
654
840
|
},
|
|
655
841
|
visitTupleType(tupleType, { self }) {
|
|
656
|
-
const items = tupleType.items.map((item) => (0,
|
|
842
|
+
const items = tupleType.items.map((item) => (0, import_visitors_core3.visit)(item, self));
|
|
657
843
|
const mergedManifest = mergeManifests(items);
|
|
658
844
|
return {
|
|
659
845
|
...mergedManifest,
|
|
@@ -673,147 +859,10 @@ function mergeManifests(manifests) {
|
|
|
673
859
|
};
|
|
674
860
|
}
|
|
675
861
|
|
|
676
|
-
// src/renderValueNodeVisitor.ts
|
|
677
|
-
var import_nodes4 = require("@codama/nodes");
|
|
678
|
-
var import_visitors_core2 = require("@codama/visitors-core");
|
|
679
|
-
function renderValueNode(value, getImportFrom, useStr = false) {
|
|
680
|
-
return (0, import_visitors_core2.visit)(value, renderValueNodeVisitor(getImportFrom, useStr));
|
|
681
|
-
}
|
|
682
|
-
function renderValueNodeVisitor(getImportFrom, useStr = false) {
|
|
683
|
-
return {
|
|
684
|
-
visitArrayValue(node) {
|
|
685
|
-
const list = node.items.map((v) => (0, import_visitors_core2.visit)(v, this));
|
|
686
|
-
return {
|
|
687
|
-
imports: new ImportMap().mergeWith(...list.map((c) => c.imports)),
|
|
688
|
-
render: `[${list.map((c) => c.render).join(", ")}]`
|
|
689
|
-
};
|
|
690
|
-
},
|
|
691
|
-
visitBooleanValue(node) {
|
|
692
|
-
return {
|
|
693
|
-
imports: new ImportMap(),
|
|
694
|
-
render: JSON.stringify(node.boolean)
|
|
695
|
-
};
|
|
696
|
-
},
|
|
697
|
-
visitBytesValue(node) {
|
|
698
|
-
const bytes = getBytesFromBytesValueNode(node);
|
|
699
|
-
const numbers = Array.from(bytes).map(import_nodes4.numberValueNode);
|
|
700
|
-
return (0, import_visitors_core2.visit)((0, import_nodes4.arrayValueNode)(numbers), this);
|
|
701
|
-
},
|
|
702
|
-
visitConstantValue(node) {
|
|
703
|
-
if ((0, import_nodes4.isNode)(node.value, "bytesValueNode")) {
|
|
704
|
-
return (0, import_visitors_core2.visit)(node.value, this);
|
|
705
|
-
}
|
|
706
|
-
if ((0, import_nodes4.isNode)(node.type, "stringTypeNode") && (0, import_nodes4.isNode)(node.value, "stringValueNode")) {
|
|
707
|
-
return (0, import_visitors_core2.visit)((0, import_nodes4.bytesValueNode)(node.type.encoding, node.value.string), this);
|
|
708
|
-
}
|
|
709
|
-
if ((0, import_nodes4.isNode)(node.type, "numberTypeNode") && (0, import_nodes4.isNode)(node.value, "numberValueNode")) {
|
|
710
|
-
const numberManifest = (0, import_visitors_core2.visit)(node.value, this);
|
|
711
|
-
const { format, endian } = node.type;
|
|
712
|
-
const byteFunction = endian === "le" ? "to_le_bytes" : "to_be_bytes";
|
|
713
|
-
numberManifest.render = `${numberManifest.render}${format}.${byteFunction}()`;
|
|
714
|
-
return numberManifest;
|
|
715
|
-
}
|
|
716
|
-
throw new Error("Unsupported constant value type.");
|
|
717
|
-
},
|
|
718
|
-
visitEnumValue(node) {
|
|
719
|
-
const imports = new ImportMap();
|
|
720
|
-
const enumName = (0, import_nodes4.pascalCase)(node.enum.name);
|
|
721
|
-
const variantName = (0, import_nodes4.pascalCase)(node.variant);
|
|
722
|
-
const importFrom = getImportFrom(node.enum);
|
|
723
|
-
imports.add(`${importFrom}::${enumName}`);
|
|
724
|
-
if (!node.value) {
|
|
725
|
-
return { imports, render: `${enumName}::${variantName}` };
|
|
726
|
-
}
|
|
727
|
-
const enumValue = (0, import_visitors_core2.visit)(node.value, this);
|
|
728
|
-
const fields = enumValue.render;
|
|
729
|
-
return {
|
|
730
|
-
imports: imports.mergeWith(enumValue.imports),
|
|
731
|
-
render: `${enumName}::${variantName} ${fields}`
|
|
732
|
-
};
|
|
733
|
-
},
|
|
734
|
-
visitMapEntryValue(node) {
|
|
735
|
-
const mapKey = (0, import_visitors_core2.visit)(node.key, this);
|
|
736
|
-
const mapValue = (0, import_visitors_core2.visit)(node.value, this);
|
|
737
|
-
return {
|
|
738
|
-
imports: mapKey.imports.mergeWith(mapValue.imports),
|
|
739
|
-
render: `[${mapKey.render}, ${mapValue.render}]`
|
|
740
|
-
};
|
|
741
|
-
},
|
|
742
|
-
visitMapValue(node) {
|
|
743
|
-
const map = node.entries.map((entry) => (0, import_visitors_core2.visit)(entry, this));
|
|
744
|
-
const imports = new ImportMap().add("std::collection::HashMap");
|
|
745
|
-
return {
|
|
746
|
-
imports: imports.mergeWith(...map.map((c) => c.imports)),
|
|
747
|
-
render: `HashMap::from([${map.map((c) => c.render).join(", ")}])`
|
|
748
|
-
};
|
|
749
|
-
},
|
|
750
|
-
visitNoneValue() {
|
|
751
|
-
return {
|
|
752
|
-
imports: new ImportMap(),
|
|
753
|
-
render: "None"
|
|
754
|
-
};
|
|
755
|
-
},
|
|
756
|
-
visitNumberValue(node) {
|
|
757
|
-
return {
|
|
758
|
-
imports: new ImportMap(),
|
|
759
|
-
render: node.number.toString()
|
|
760
|
-
};
|
|
761
|
-
},
|
|
762
|
-
visitPublicKeyValue(node) {
|
|
763
|
-
return {
|
|
764
|
-
imports: new ImportMap().add("solana_pubkey"),
|
|
765
|
-
render: `pubkey!("${node.publicKey}")`
|
|
766
|
-
};
|
|
767
|
-
},
|
|
768
|
-
visitSetValue(node) {
|
|
769
|
-
const set = node.items.map((v) => (0, import_visitors_core2.visit)(v, this));
|
|
770
|
-
const imports = new ImportMap().add("std::collection::HashSet");
|
|
771
|
-
return {
|
|
772
|
-
imports: imports.mergeWith(...set.map((c) => c.imports)),
|
|
773
|
-
render: `HashSet::from([${set.map((c) => c.render).join(", ")}])`
|
|
774
|
-
};
|
|
775
|
-
},
|
|
776
|
-
visitSomeValue(node) {
|
|
777
|
-
const child = (0, import_visitors_core2.visit)(node.value, this);
|
|
778
|
-
return {
|
|
779
|
-
...child,
|
|
780
|
-
render: `Some(${child.render})`
|
|
781
|
-
};
|
|
782
|
-
},
|
|
783
|
-
visitStringValue(node) {
|
|
784
|
-
return {
|
|
785
|
-
imports: new ImportMap(),
|
|
786
|
-
render: useStr ? `${JSON.stringify(node.string)}` : `String::from(${JSON.stringify(node.string)})`
|
|
787
|
-
};
|
|
788
|
-
},
|
|
789
|
-
visitStructFieldValue(node) {
|
|
790
|
-
const structValue = (0, import_visitors_core2.visit)(node.value, this);
|
|
791
|
-
return {
|
|
792
|
-
imports: structValue.imports,
|
|
793
|
-
render: `${node.name}: ${structValue.render}`
|
|
794
|
-
};
|
|
795
|
-
},
|
|
796
|
-
visitStructValue(node) {
|
|
797
|
-
const struct = node.fields.map((field) => (0, import_visitors_core2.visit)(field, this));
|
|
798
|
-
return {
|
|
799
|
-
imports: new ImportMap().mergeWith(...struct.map((c) => c.imports)),
|
|
800
|
-
render: `{ ${struct.map((c) => c.render).join(", ")} }`
|
|
801
|
-
};
|
|
802
|
-
},
|
|
803
|
-
visitTupleValue(node) {
|
|
804
|
-
const tuple = node.items.map((v) => (0, import_visitors_core2.visit)(v, this));
|
|
805
|
-
return {
|
|
806
|
-
imports: new ImportMap().mergeWith(...tuple.map((c) => c.imports)),
|
|
807
|
-
render: `(${tuple.map((c) => c.render).join(", ")})`
|
|
808
|
-
};
|
|
809
|
-
}
|
|
810
|
-
};
|
|
811
|
-
}
|
|
812
|
-
|
|
813
862
|
// src/getRenderMapVisitor.ts
|
|
814
863
|
function getRenderMapVisitor(options = {}) {
|
|
815
|
-
const linkables = new
|
|
816
|
-
const stack = new
|
|
864
|
+
const linkables = new import_visitors_core4.LinkableDictionary();
|
|
865
|
+
const stack = new import_visitors_core4.NodeStack();
|
|
817
866
|
let program = null;
|
|
818
867
|
const renderParentInstructions = options.renderParentInstructions ?? false;
|
|
819
868
|
const dependencyMap = options.dependencyMap ?? {};
|
|
@@ -821,46 +870,55 @@ function getRenderMapVisitor(options = {}) {
|
|
|
821
870
|
const getTraitsFromNode2 = getTraitsFromNodeFactory(options.traitOptions);
|
|
822
871
|
const typeManifestVisitor = getTypeManifestVisitor({ getImportFrom, getTraitsFromNode: getTraitsFromNode2 });
|
|
823
872
|
const anchorTraits = options.anchorTraits ?? true;
|
|
824
|
-
return (0,
|
|
825
|
-
(0,
|
|
873
|
+
return (0, import_visitors_core4.pipe)(
|
|
874
|
+
(0, import_visitors_core4.staticVisitor)(() => new import_renderers_core.RenderMap(), {
|
|
826
875
|
keys: ["rootNode", "programNode", "instructionNode", "accountNode", "definedTypeNode"]
|
|
827
876
|
}),
|
|
828
|
-
(v) => (0,
|
|
877
|
+
(v) => (0, import_visitors_core4.extendVisitor)(v, {
|
|
829
878
|
visitAccount(node) {
|
|
830
|
-
const typeManifest = (0,
|
|
879
|
+
const typeManifest = (0, import_visitors_core4.visit)(node, typeManifestVisitor);
|
|
880
|
+
const fields = (0, import_nodes6.resolveNestedTypeNode)(node.data).fields;
|
|
881
|
+
const discriminatorConstants = getDiscriminatorConstants({
|
|
882
|
+
discriminatorNodes: node.discriminators ?? [],
|
|
883
|
+
fields,
|
|
884
|
+
getImportFrom,
|
|
885
|
+
prefix: node.name,
|
|
886
|
+
typeManifestVisitor
|
|
887
|
+
});
|
|
831
888
|
const seedsImports = new ImportMap();
|
|
832
889
|
const pda = node.pda ? linkables.get([...stack.getPath(), node.pda]) : void 0;
|
|
833
890
|
const pdaSeeds = pda?.seeds ?? [];
|
|
834
891
|
const seeds = pdaSeeds.map((seed) => {
|
|
835
|
-
if ((0,
|
|
836
|
-
const seedManifest2 = (0,
|
|
892
|
+
if ((0, import_nodes6.isNode)(seed, "variablePdaSeedNode")) {
|
|
893
|
+
const seedManifest2 = (0, import_visitors_core4.visit)(seed.type, typeManifestVisitor);
|
|
837
894
|
seedsImports.mergeWith(seedManifest2.imports);
|
|
838
|
-
const resolvedType2 = (0,
|
|
895
|
+
const resolvedType2 = (0, import_nodes6.resolveNestedTypeNode)(seed.type);
|
|
839
896
|
return { ...seed, resolvedType: resolvedType2, typeManifest: seedManifest2 };
|
|
840
897
|
}
|
|
841
|
-
if ((0,
|
|
898
|
+
if ((0, import_nodes6.isNode)(seed.value, "programIdValueNode")) {
|
|
842
899
|
return seed;
|
|
843
900
|
}
|
|
844
|
-
const seedManifest = (0,
|
|
901
|
+
const seedManifest = (0, import_visitors_core4.visit)(seed.type, typeManifestVisitor);
|
|
845
902
|
const valueManifest = renderValueNode(seed.value, getImportFrom, true);
|
|
846
903
|
seedsImports.mergeWith(valueManifest.imports);
|
|
847
|
-
const resolvedType = (0,
|
|
904
|
+
const resolvedType = (0, import_nodes6.resolveNestedTypeNode)(seed.type);
|
|
848
905
|
return { ...seed, resolvedType, typeManifest: seedManifest, valueManifest };
|
|
849
906
|
});
|
|
850
|
-
const hasVariableSeeds = pdaSeeds.filter((0,
|
|
851
|
-
const constantSeeds = seeds.filter((0,
|
|
907
|
+
const hasVariableSeeds = pdaSeeds.filter((0, import_nodes6.isNodeFilter)("variablePdaSeedNode")).length > 0;
|
|
908
|
+
const constantSeeds = seeds.filter((0, import_nodes6.isNodeFilter)("constantPdaSeedNode")).filter((seed) => !(0, import_nodes6.isNode)(seed.value, "programIdValueNode"));
|
|
852
909
|
const { imports } = typeManifest;
|
|
853
910
|
if (hasVariableSeeds) {
|
|
854
911
|
imports.mergeWith(seedsImports);
|
|
855
912
|
}
|
|
856
913
|
return new import_renderers_core.RenderMap().add(
|
|
857
|
-
`accounts/${(0,
|
|
914
|
+
`accounts/${(0, import_nodes6.snakeCase)(node.name)}.rs`,
|
|
858
915
|
render("accountsPage.njk", {
|
|
859
916
|
account: node,
|
|
860
917
|
anchorTraits,
|
|
861
918
|
constantSeeds,
|
|
919
|
+
discriminatorConstants: discriminatorConstants.render,
|
|
862
920
|
hasVariableSeeds,
|
|
863
|
-
imports: imports.remove(`generatedAccounts::${(0,
|
|
921
|
+
imports: imports.mergeWith(discriminatorConstants.imports).remove(`generatedAccounts::${(0, import_nodes6.pascalCase)(node.name)}`).toString(dependencyMap),
|
|
864
922
|
pda,
|
|
865
923
|
program,
|
|
866
924
|
seeds,
|
|
@@ -869,13 +927,13 @@ function getRenderMapVisitor(options = {}) {
|
|
|
869
927
|
);
|
|
870
928
|
},
|
|
871
929
|
visitDefinedType(node) {
|
|
872
|
-
const typeManifest = (0,
|
|
930
|
+
const typeManifest = (0, import_visitors_core4.visit)(node, typeManifestVisitor);
|
|
873
931
|
const imports = new ImportMap().mergeWithManifest(typeManifest);
|
|
874
932
|
return new import_renderers_core.RenderMap().add(
|
|
875
|
-
`types/${(0,
|
|
933
|
+
`types/${(0, import_nodes6.snakeCase)(node.name)}.rs`,
|
|
876
934
|
render("definedTypesPage.njk", {
|
|
877
935
|
definedType: node,
|
|
878
|
-
imports: imports.remove(`generatedTypes::${(0,
|
|
936
|
+
imports: imports.remove(`generatedTypes::${(0, import_nodes6.pascalCase)(node.name)}`).toString(dependencyMap),
|
|
879
937
|
typeManifest
|
|
880
938
|
})
|
|
881
939
|
);
|
|
@@ -888,6 +946,13 @@ function getRenderMapVisitor(options = {}) {
|
|
|
888
946
|
`[Rust] Accounts and args of instruction [${node.name}] have the following conflicting attributes [${accountsAndArgsConflicts.join(", ")}]. Thus, the conflicting arguments will be suffixed with "_arg". You may want to rename the conflicting attributes.`
|
|
889
947
|
);
|
|
890
948
|
}
|
|
949
|
+
const discriminatorConstants = getDiscriminatorConstants({
|
|
950
|
+
discriminatorNodes: node.discriminators ?? [],
|
|
951
|
+
fields: node.arguments,
|
|
952
|
+
getImportFrom,
|
|
953
|
+
prefix: node.name,
|
|
954
|
+
typeManifestVisitor
|
|
955
|
+
});
|
|
891
956
|
const instructionArgs = [];
|
|
892
957
|
let hasArgs = false;
|
|
893
958
|
let hasOptional = false;
|
|
@@ -896,12 +961,12 @@ function getRenderMapVisitor(options = {}) {
|
|
|
896
961
|
getImportFrom,
|
|
897
962
|
getTraitsFromNode: getTraitsFromNode2,
|
|
898
963
|
nestedStruct: true,
|
|
899
|
-
parentName: `${(0,
|
|
964
|
+
parentName: `${(0, import_nodes6.pascalCase)(node.name)}InstructionData`
|
|
900
965
|
});
|
|
901
|
-
const manifest = (0,
|
|
966
|
+
const manifest = (0, import_visitors_core4.visit)(argument.type, argumentVisitor);
|
|
902
967
|
imports.mergeWith(manifest.imports);
|
|
903
|
-
const innerOptionType = (0,
|
|
904
|
-
const hasDefaultValue = !!argument.defaultValue && (0,
|
|
968
|
+
const innerOptionType = (0, import_nodes6.isNode)(argument.type, "optionTypeNode") ? manifest.type.slice("Option<".length, -1) : null;
|
|
969
|
+
const hasDefaultValue = !!argument.defaultValue && (0, import_nodes6.isNode)(argument.defaultValue, import_nodes6.VALUE_NODES);
|
|
905
970
|
let renderValue = null;
|
|
906
971
|
if (hasDefaultValue) {
|
|
907
972
|
const { imports: argImports, render: value } = renderValueNode(
|
|
@@ -923,22 +988,23 @@ function getRenderMapVisitor(options = {}) {
|
|
|
923
988
|
value: renderValue
|
|
924
989
|
});
|
|
925
990
|
});
|
|
926
|
-
const struct = (0,
|
|
991
|
+
const struct = (0, import_nodes6.structTypeNodeFromInstructionArgumentNodes)(node.arguments);
|
|
927
992
|
const structVisitor = getTypeManifestVisitor({
|
|
928
993
|
getImportFrom,
|
|
929
994
|
getTraitsFromNode: getTraitsFromNode2,
|
|
930
|
-
parentName: `${(0,
|
|
995
|
+
parentName: `${(0, import_nodes6.pascalCase)(node.name)}InstructionData`
|
|
931
996
|
});
|
|
932
|
-
const typeManifest = (0,
|
|
997
|
+
const typeManifest = (0, import_visitors_core4.visit)(struct, structVisitor);
|
|
933
998
|
const dataTraits = getTraitsFromNode2(node);
|
|
934
999
|
imports.mergeWith(dataTraits.imports);
|
|
935
1000
|
return new import_renderers_core.RenderMap().add(
|
|
936
|
-
`instructions/${(0,
|
|
1001
|
+
`instructions/${(0, import_nodes6.snakeCase)(node.name)}.rs`,
|
|
937
1002
|
render("instructionsPage.njk", {
|
|
938
1003
|
dataTraits: dataTraits.render,
|
|
1004
|
+
discriminatorConstants: discriminatorConstants.render,
|
|
939
1005
|
hasArgs,
|
|
940
1006
|
hasOptional,
|
|
941
|
-
imports: imports.remove(`generatedInstructions::${(0,
|
|
1007
|
+
imports: imports.mergeWith(discriminatorConstants.imports).remove(`generatedInstructions::${(0, import_nodes6.pascalCase)(node.name)}`).toString(dependencyMap),
|
|
942
1008
|
instruction: node,
|
|
943
1009
|
instructionArgs,
|
|
944
1010
|
program,
|
|
@@ -948,14 +1014,14 @@ function getRenderMapVisitor(options = {}) {
|
|
|
948
1014
|
},
|
|
949
1015
|
visitProgram(node, { self }) {
|
|
950
1016
|
program = node;
|
|
951
|
-
const renderMap = new import_renderers_core.RenderMap().mergeWith(...node.accounts.map((account) => (0,
|
|
952
|
-
...(0,
|
|
1017
|
+
const renderMap = new import_renderers_core.RenderMap().mergeWith(...node.accounts.map((account) => (0, import_visitors_core4.visit)(account, self))).mergeWith(...node.definedTypes.map((type) => (0, import_visitors_core4.visit)(type, self))).mergeWith(
|
|
1018
|
+
...(0, import_nodes6.getAllInstructionsWithSubs)(node, {
|
|
953
1019
|
leavesOnly: !renderParentInstructions
|
|
954
|
-
}).map((ix) => (0,
|
|
1020
|
+
}).map((ix) => (0, import_visitors_core4.visit)(ix, self))
|
|
955
1021
|
);
|
|
956
1022
|
if (node.errors.length > 0) {
|
|
957
1023
|
renderMap.add(
|
|
958
|
-
`errors/${(0,
|
|
1024
|
+
`errors/${(0, import_nodes6.snakeCase)(node.name)}.rs`,
|
|
959
1025
|
render("errorsPage.njk", {
|
|
960
1026
|
errors: node.errors,
|
|
961
1027
|
imports: new ImportMap().toString(dependencyMap),
|
|
@@ -967,12 +1033,12 @@ function getRenderMapVisitor(options = {}) {
|
|
|
967
1033
|
return renderMap;
|
|
968
1034
|
},
|
|
969
1035
|
visitRoot(node, { self }) {
|
|
970
|
-
const programsToExport = (0,
|
|
971
|
-
const accountsToExport = (0,
|
|
972
|
-
const instructionsToExport = (0,
|
|
1036
|
+
const programsToExport = (0, import_nodes6.getAllPrograms)(node);
|
|
1037
|
+
const accountsToExport = (0, import_nodes6.getAllAccounts)(node);
|
|
1038
|
+
const instructionsToExport = (0, import_nodes6.getAllInstructionsWithSubs)(node, {
|
|
973
1039
|
leavesOnly: !renderParentInstructions
|
|
974
1040
|
});
|
|
975
|
-
const definedTypesToExport = (0,
|
|
1041
|
+
const definedTypesToExport = (0, import_nodes6.getAllDefinedTypes)(node);
|
|
976
1042
|
const hasAnythingToExport = programsToExport.length > 0 || accountsToExport.length > 0 || instructionsToExport.length > 0 || definedTypesToExport.length > 0;
|
|
977
1043
|
const ctx = {
|
|
978
1044
|
accountsToExport,
|
|
@@ -1001,11 +1067,11 @@ function getRenderMapVisitor(options = {}) {
|
|
|
1001
1067
|
if (definedTypesToExport.length > 0) {
|
|
1002
1068
|
map.add("types/mod.rs", render("definedTypesMod.njk", ctx));
|
|
1003
1069
|
}
|
|
1004
|
-
return map.add("mod.rs", render("rootMod.njk", ctx)).mergeWith(...(0,
|
|
1070
|
+
return map.add("mod.rs", render("rootMod.njk", ctx)).mergeWith(...(0, import_nodes6.getAllPrograms)(node).map((p) => (0, import_visitors_core4.visit)(p, self)));
|
|
1005
1071
|
}
|
|
1006
1072
|
}),
|
|
1007
|
-
(v) => (0,
|
|
1008
|
-
(v) => (0,
|
|
1073
|
+
(v) => (0, import_visitors_core4.recordNodeStackVisitor)(v, stack),
|
|
1074
|
+
(v) => (0, import_visitors_core4.recordLinkablesOnFirstVisitVisitor)(v, linkables)
|
|
1009
1075
|
);
|
|
1010
1076
|
}
|
|
1011
1077
|
function getConflictsForInstructionAccountsAndArgs(instruction) {
|
|
@@ -1020,14 +1086,14 @@ function getConflictsForInstructionAccountsAndArgs(instruction) {
|
|
|
1020
1086
|
// src/renderVisitor.ts
|
|
1021
1087
|
var import_errors4 = require("@codama/errors");
|
|
1022
1088
|
var import_renderers_core2 = require("@codama/renderers-core");
|
|
1023
|
-
var
|
|
1089
|
+
var import_visitors_core5 = require("@codama/visitors-core");
|
|
1024
1090
|
var import_child_process = require("child_process");
|
|
1025
1091
|
function renderVisitor(path, options = {}) {
|
|
1026
|
-
return (0,
|
|
1092
|
+
return (0, import_visitors_core5.rootNodeVisitor)((root) => {
|
|
1027
1093
|
if (options.deleteFolderBeforeRendering ?? true) {
|
|
1028
1094
|
(0, import_renderers_core2.deleteDirectory)(path);
|
|
1029
1095
|
}
|
|
1030
|
-
(0,
|
|
1096
|
+
(0, import_visitors_core5.visit)(root, (0, import_renderers_core2.writeRenderMapVisitor)(getRenderMapVisitor(options), path));
|
|
1031
1097
|
if (options.formatCode) {
|
|
1032
1098
|
if (options.crateFolder) {
|
|
1033
1099
|
const toolchain = options.toolchain ?? "+stable";
|