@codama/renderers-rust 1.1.1 → 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.
@@ -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 import_nodes5 = require("@codama/nodes");
114
+ var import_nodes6 = require("@codama/nodes");
115
115
  var import_renderers_core = require("@codama/renderers-core");
116
- var import_visitors_core3 = require("@codama/visitors-core");
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 import_nodes3 = require("@codama/nodes");
121
- var import_visitors_core = require("@codama/visitors-core");
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 import_nodes = require("@codama/nodes");
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", import_nodes.pascalCase);
198
- env.addFilter("camelCase", import_nodes.camelCase);
199
- env.addFilter("snakeCase", import_nodes.snakeCase);
200
- env.addFilter("kebabCase", import_nodes.kebabCase);
201
- env.addFilter("titleCase", import_nodes.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 import_nodes2 = require("@codama/nodes");
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, import_nodes2.assertIsNode)(node, ["accountNode", "definedTypeNode", "instructionNode"]);
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, import_nodes2.camelCase)(key), value])
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, import_nodes2.isNode)(node, ["accountNode", "instructionNode"])) return "struct";
260
- if ((0, import_nodes2.isNode)(node.type, "structTypeNode")) return "struct";
261
- if ((0, import_nodes2.isNode)(node.type, "enumTypeNode")) {
262
- return (0, import_nodes2.isScalarEnum)(node.type) ? "scalarEnum" : "dataEnum";
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, import_visitors_core.pipe)(
316
- (0, import_visitors_core.mergeVisitor)(
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: [...import_nodes3.REGISTERED_TYPE_NODE_KINDS, "definedTypeLinkNode", "definedTypeNode", "accountNode"] }
508
+ { keys: [...import_nodes5.REGISTERED_TYPE_NODE_KINDS, "definedTypeLinkNode", "definedTypeNode", "accountNode"] }
323
509
  ),
324
- (v) => (0, import_visitors_core.extendVisitor)(v, {
510
+ (v) => (0, import_visitors_core3.extendVisitor)(v, {
325
511
  visitAccount(account, { self }) {
326
- parentName = (0, import_nodes3.pascalCase)(account.name);
327
- const manifest = (0, import_visitors_core.visit)(account.data, self);
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, import_visitors_core.visit)(arrayType.item, self);
338
- if ((0, import_nodes3.isNode)(arrayType.count, "fixedCountNode")) {
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, import_nodes3.isNode)(arrayType.count, "remainderCountNode")) {
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, import_nodes3.resolveNestedTypeNode)(arrayType.count.prefix);
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, import_nodes3.resolveNestedTypeNode)(booleanType.size);
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, import_nodes3.remainderCountNode)();
580
+ let arraySize = (0, import_nodes5.remainderCountNode)();
395
581
  if (typeof parentSize === "number") {
396
- arraySize = (0, import_nodes3.fixedCountNode)(parentSize);
582
+ arraySize = (0, import_nodes5.fixedCountNode)(parentSize);
397
583
  } else if (parentSize && typeof parentSize === "object") {
398
- arraySize = (0, import_nodes3.prefixedCountNode)(parentSize);
584
+ arraySize = (0, import_nodes5.prefixedCountNode)(parentSize);
399
585
  }
400
- const arrayType = (0, import_nodes3.arrayTypeNode)((0, import_nodes3.numberTypeNode)("u8"), arraySize);
401
- return (0, import_visitors_core.visit)(arrayType, self);
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, import_nodes3.pascalCase)(definedType.name);
405
- const manifest = (0, import_visitors_core.visit)(definedType.type, self);
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, import_nodes3.isNode)(definedType.type, ["enumTypeNode", "structTypeNode"]) ? manifest.type : `pub type ${(0, import_nodes3.pascalCase)(definedType.name)} = ${manifest.type};`;
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, import_nodes3.pascalCase)(node.name);
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, import_nodes3.pascalCase)(enumEmptyVariantType.name);
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, import_nodes3.pascalCase)(enumStructVariantType.name);
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, import_nodes3.pascalCase)(originalParentName) + name;
437
- const typeManifest = (0, import_visitors_core.visit)(enumStructVariantType.struct, self);
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, import_nodes3.pascalCase)(enumTupleVariantType.name);
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, import_nodes3.pascalCase)(originalParentName) + name;
452
- const childManifest = (0, import_visitors_core.visit)(enumTupleVariantType.tuple, self);
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, import_visitors_core.visit)(variant, self));
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, import_nodes3.pascalCase)(originalParentName)} {
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, import_visitors_core.visit)(fixedSizeType.type, self);
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, import_visitors_core.visit)(mapType.key, self);
488
- const value = (0, import_visitors_core.visit)(mapType.value, self);
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, import_visitors_core.visit)(optionType.item, self);
515
- const optionPrefix = (0, import_nodes3.resolveNestedTypeNode)(optionType.prefix);
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, import_visitors_core.visit)(setType.item, self);
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, import_nodes3.resolveNestedTypeNode)(sizePrefixType.prefix);
544
- const manifest = (0, import_visitors_core.visit)(sizePrefixType.type, self);
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, import_nodes3.isNode)(parentSize, "numberTypeNode") && parentSize.endian === "le") {
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, import_nodes3.pascalCase)(originalParentName) + (0, import_nodes3.pascalCase)(structFieldType.name);
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, import_visitors_core.visit)(structFieldType.type, self);
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, import_nodes3.snakeCase)(structFieldType.name);
602
- const docblock = rustDocblock((0, import_nodes3.parseDocs)(structFieldType.docs));
603
- const resolvedNestedType = (0, import_nodes3.resolveNestedTypeNode)(structFieldType.type);
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, import_nodes3.isNode)(resolvedNestedType, "arrayTypeNode") && (0, import_nodes3.isNode)(resolvedNestedType.count, "fixedCountNode") && resolvedNestedType.count.value > 32) {
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, import_nodes3.isNode)(resolvedNestedType, ["bytesTypeNode", "stringTypeNode"]) && (0, import_nodes3.isNode)(structFieldType.type, "fixedSizeTypeNode") && structFieldType.type.size > 32) {
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, import_visitors_core.visit)(field, self));
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, import_nodes3.definedTypeNode)({ name: originalParentName, type: structType })
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, import_nodes3.pascalCase)(originalParentName)} {
822
+ `${nestedTraits.render}pub struct ${(0, import_nodes5.pascalCase)(originalParentName)} {
637
823
  ${fieldTypes}
638
824
  }`
639
825
  ],
640
- type: (0, import_nodes3.pascalCase)(originalParentName)
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, import_nodes3.pascalCase)(originalParentName)} {
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, import_visitors_core.visit)(item, self));
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 import_visitors_core3.LinkableDictionary();
816
- const stack = new import_visitors_core3.NodeStack();
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, import_visitors_core3.pipe)(
825
- (0, import_visitors_core3.staticVisitor)(() => new import_renderers_core.RenderMap(), {
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, import_visitors_core3.extendVisitor)(v, {
877
+ (v) => (0, import_visitors_core4.extendVisitor)(v, {
829
878
  visitAccount(node) {
830
- const typeManifest = (0, import_visitors_core3.visit)(node, typeManifestVisitor);
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, import_nodes5.isNode)(seed, "variablePdaSeedNode")) {
836
- const seedManifest2 = (0, import_visitors_core3.visit)(seed.type, typeManifestVisitor);
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, import_nodes5.resolveNestedTypeNode)(seed.type);
895
+ const resolvedType2 = (0, import_nodes6.resolveNestedTypeNode)(seed.type);
839
896
  return { ...seed, resolvedType: resolvedType2, typeManifest: seedManifest2 };
840
897
  }
841
- if ((0, import_nodes5.isNode)(seed.value, "programIdValueNode")) {
898
+ if ((0, import_nodes6.isNode)(seed.value, "programIdValueNode")) {
842
899
  return seed;
843
900
  }
844
- const seedManifest = (0, import_visitors_core3.visit)(seed.type, typeManifestVisitor);
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, import_nodes5.resolveNestedTypeNode)(seed.type);
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, import_nodes5.isNodeFilter)("variablePdaSeedNode")).length > 0;
851
- const constantSeeds = seeds.filter((0, import_nodes5.isNodeFilter)("constantPdaSeedNode")).filter((seed) => !(0, import_nodes5.isNode)(seed.value, "programIdValueNode"));
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, import_nodes5.snakeCase)(node.name)}.rs`,
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, import_nodes5.pascalCase)(node.name)}`).toString(dependencyMap),
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, import_visitors_core3.visit)(node, typeManifestVisitor);
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, import_nodes5.snakeCase)(node.name)}.rs`,
933
+ `types/${(0, import_nodes6.snakeCase)(node.name)}.rs`,
876
934
  render("definedTypesPage.njk", {
877
935
  definedType: node,
878
- imports: imports.remove(`generatedTypes::${(0, import_nodes5.pascalCase)(node.name)}`).toString(dependencyMap),
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, import_nodes5.pascalCase)(node.name)}InstructionData`
964
+ parentName: `${(0, import_nodes6.pascalCase)(node.name)}InstructionData`
900
965
  });
901
- const manifest = (0, import_visitors_core3.visit)(argument.type, argumentVisitor);
966
+ const manifest = (0, import_visitors_core4.visit)(argument.type, argumentVisitor);
902
967
  imports.mergeWith(manifest.imports);
903
- const innerOptionType = (0, import_nodes5.isNode)(argument.type, "optionTypeNode") ? manifest.type.slice("Option<".length, -1) : null;
904
- const hasDefaultValue = !!argument.defaultValue && (0, import_nodes5.isNode)(argument.defaultValue, import_nodes5.VALUE_NODES);
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, import_nodes5.structTypeNodeFromInstructionArgumentNodes)(node.arguments);
991
+ const struct = (0, import_nodes6.structTypeNodeFromInstructionArgumentNodes)(node.arguments);
927
992
  const structVisitor = getTypeManifestVisitor({
928
993
  getImportFrom,
929
994
  getTraitsFromNode: getTraitsFromNode2,
930
- parentName: `${(0, import_nodes5.pascalCase)(node.name)}InstructionData`
995
+ parentName: `${(0, import_nodes6.pascalCase)(node.name)}InstructionData`
931
996
  });
932
- const typeManifest = (0, import_visitors_core3.visit)(struct, structVisitor);
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, import_nodes5.snakeCase)(node.name)}.rs`,
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, import_nodes5.pascalCase)(node.name)}`).toString(dependencyMap),
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, import_visitors_core3.visit)(account, self))).mergeWith(...node.definedTypes.map((type) => (0, import_visitors_core3.visit)(type, self))).mergeWith(
952
- ...(0, import_nodes5.getAllInstructionsWithSubs)(node, {
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, import_visitors_core3.visit)(ix, self))
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, import_nodes5.snakeCase)(node.name)}.rs`,
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, import_nodes5.getAllPrograms)(node);
971
- const accountsToExport = (0, import_nodes5.getAllAccounts)(node);
972
- const instructionsToExport = (0, import_nodes5.getAllInstructionsWithSubs)(node, {
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, import_nodes5.getAllDefinedTypes)(node);
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, import_nodes5.getAllPrograms)(node).map((p) => (0, import_visitors_core3.visit)(p, self)));
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, import_visitors_core3.recordNodeStackVisitor)(v, stack),
1008
- (v) => (0, import_visitors_core3.recordLinkablesOnFirstVisitVisitor)(v, linkables)
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 import_visitors_core4 = require("@codama/visitors-core");
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, import_visitors_core4.rootNodeVisitor)((root) => {
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, import_visitors_core4.visit)(root, (0, import_renderers_core2.writeRenderMapVisitor)(getRenderMapVisitor(options), path));
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";