@codama/renderers-rust 1.2.7 → 1.2.9
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 +193 -260
- package/dist/index.node.cjs.map +1 -1
- package/dist/index.node.mjs +113 -203
- package/dist/index.node.mjs.map +1 -1
- package/dist/types/getRenderMapVisitor.d.ts +3 -1
- package/dist/types/getRenderMapVisitor.d.ts.map +1 -1
- package/package.json +10 -10
package/dist/index.node.mjs
CHANGED
|
@@ -1,3 +1,13 @@
|
|
|
1
|
+
import { CodamaError, CODAMA_ERROR__RENDERERS__UNSUPPORTED_NODE, logWarn, logError, CODAMA_ERROR__UNEXPECTED_NODE_KIND } from '@codama/errors';
|
|
2
|
+
import { REGISTERED_TYPE_NODE_KINDS, definedTypeNode, pascalCase, snakeCase, parseDocs, resolveNestedTypeNode, isNode, remainderCountNode, fixedCountNode, prefixedCountNode, arrayTypeNode, numberTypeNode, getAllPrograms, getAllAccounts, getAllInstructionsWithSubs, getAllDefinedTypes, VALUE_NODES, structTypeNodeFromInstructionArgumentNodes, isNodeFilter, camelCase, kebabCase, titleCase, assertIsNode, bytesValueNode, numberValueNode, arrayValueNode, isScalarEnum } from '@codama/nodes';
|
|
3
|
+
import { createRenderMap, mergeRenderMaps, addToRenderMap, deleteDirectory, writeRenderMapVisitor } from '@codama/renderers-core';
|
|
4
|
+
import { pipe, mergeVisitor, extendVisitor, visit, LinkableDictionary, NodeStack, staticVisitor, recordNodeStackVisitor, recordLinkablesOnFirstVisitVisitor, rootNodeVisitor } from '@codama/visitors-core';
|
|
5
|
+
import { getBase64Encoder, getBase58Encoder, getBase16Encoder, getUtf8Encoder } from '@solana/codecs-strings';
|
|
6
|
+
import { dirname, join } from 'path';
|
|
7
|
+
import { fileURLToPath } from 'url';
|
|
8
|
+
import nunjucks from 'nunjucks';
|
|
9
|
+
import { spawnSync } from 'child_process';
|
|
10
|
+
|
|
1
11
|
// src/ImportMap.ts
|
|
2
12
|
var DEFAULT_MODULE_MAP = {
|
|
3
13
|
generated: "crate::generated",
|
|
@@ -68,54 +78,6 @@ var ImportMap = class _ImportMap {
|
|
|
68
78
|
return importStatements.join("\n");
|
|
69
79
|
}
|
|
70
80
|
};
|
|
71
|
-
|
|
72
|
-
// src/getRenderMapVisitor.ts
|
|
73
|
-
import { logWarn } from "@codama/errors";
|
|
74
|
-
import {
|
|
75
|
-
getAllAccounts,
|
|
76
|
-
getAllDefinedTypes,
|
|
77
|
-
getAllInstructionsWithSubs,
|
|
78
|
-
getAllPrograms,
|
|
79
|
-
isNode as isNode5,
|
|
80
|
-
isNodeFilter as isNodeFilter2,
|
|
81
|
-
pascalCase as pascalCase4,
|
|
82
|
-
resolveNestedTypeNode as resolveNestedTypeNode2,
|
|
83
|
-
snakeCase as snakeCase4,
|
|
84
|
-
structTypeNodeFromInstructionArgumentNodes,
|
|
85
|
-
VALUE_NODES as VALUE_NODES2
|
|
86
|
-
} from "@codama/nodes";
|
|
87
|
-
import { addToRenderMap, createRenderMap, mergeRenderMaps } from "@codama/renderers-core";
|
|
88
|
-
import {
|
|
89
|
-
extendVisitor as extendVisitor2,
|
|
90
|
-
LinkableDictionary,
|
|
91
|
-
NodeStack,
|
|
92
|
-
pipe as pipe2,
|
|
93
|
-
recordLinkablesOnFirstVisitVisitor,
|
|
94
|
-
recordNodeStackVisitor,
|
|
95
|
-
staticVisitor,
|
|
96
|
-
visit as visit4
|
|
97
|
-
} from "@codama/visitors-core";
|
|
98
|
-
|
|
99
|
-
// src/getTypeManifestVisitor.ts
|
|
100
|
-
import { CODAMA_ERROR__RENDERERS__UNSUPPORTED_NODE, CodamaError as CodamaError2 } from "@codama/errors";
|
|
101
|
-
import {
|
|
102
|
-
arrayTypeNode,
|
|
103
|
-
definedTypeNode,
|
|
104
|
-
fixedCountNode,
|
|
105
|
-
isNode as isNode4,
|
|
106
|
-
numberTypeNode,
|
|
107
|
-
parseDocs,
|
|
108
|
-
pascalCase as pascalCase3,
|
|
109
|
-
prefixedCountNode,
|
|
110
|
-
REGISTERED_TYPE_NODE_KINDS,
|
|
111
|
-
remainderCountNode,
|
|
112
|
-
resolveNestedTypeNode,
|
|
113
|
-
snakeCase as snakeCase3
|
|
114
|
-
} from "@codama/nodes";
|
|
115
|
-
import { extendVisitor, mergeVisitor, pipe, visit as visit3 } from "@codama/visitors-core";
|
|
116
|
-
|
|
117
|
-
// src/utils/codecs.ts
|
|
118
|
-
import { getBase16Encoder, getBase58Encoder, getBase64Encoder, getUtf8Encoder } from "@solana/codecs-strings";
|
|
119
81
|
function getBytesFromBytesValueNode(node) {
|
|
120
82
|
switch (node.encoding) {
|
|
121
83
|
case "utf8":
|
|
@@ -129,26 +91,6 @@ function getBytesFromBytesValueNode(node) {
|
|
|
129
91
|
return getBase64Encoder().encode(node.data);
|
|
130
92
|
}
|
|
131
93
|
}
|
|
132
|
-
|
|
133
|
-
// src/utils/discriminatorConstant.ts
|
|
134
|
-
import {
|
|
135
|
-
camelCase,
|
|
136
|
-
isNode as isNode2,
|
|
137
|
-
isNodeFilter,
|
|
138
|
-
snakeCase,
|
|
139
|
-
VALUE_NODES
|
|
140
|
-
} from "@codama/nodes";
|
|
141
|
-
import { visit as visit2 } from "@codama/visitors-core";
|
|
142
|
-
|
|
143
|
-
// src/renderValueNodeVisitor.ts
|
|
144
|
-
import {
|
|
145
|
-
arrayValueNode,
|
|
146
|
-
bytesValueNode,
|
|
147
|
-
isNode,
|
|
148
|
-
numberValueNode,
|
|
149
|
-
pascalCase
|
|
150
|
-
} from "@codama/nodes";
|
|
151
|
-
import { visit } from "@codama/visitors-core";
|
|
152
94
|
function renderValueNode(value, getImportFrom, useStr = false) {
|
|
153
95
|
return visit(value, renderValueNodeVisitor(getImportFrom, useStr));
|
|
154
96
|
}
|
|
@@ -308,18 +250,18 @@ function getConstantDiscriminatorConstant(discriminatorNode, scope) {
|
|
|
308
250
|
const index = discriminatorNodes.filter(isNodeFilter("constantDiscriminatorNode")).indexOf(discriminatorNode);
|
|
309
251
|
const suffix = index <= 0 ? "" : `_${index + 1}`;
|
|
310
252
|
const name = camelCase(`${prefix}_discriminator${suffix}`);
|
|
311
|
-
const typeManifest =
|
|
253
|
+
const typeManifest = visit(discriminatorNode.constant.type, typeManifestVisitor);
|
|
312
254
|
const value = renderValueNode(discriminatorNode.constant.value, getImportFrom);
|
|
313
255
|
return getConstant(name, typeManifest, value);
|
|
314
256
|
}
|
|
315
257
|
function getFieldDiscriminatorConstant(discriminatorNode, scope) {
|
|
316
258
|
const { fields, prefix, getImportFrom, typeManifestVisitor } = scope;
|
|
317
259
|
const field = fields.find((f) => f.name === discriminatorNode.name);
|
|
318
|
-
if (!field || !field.defaultValue || !
|
|
260
|
+
if (!field || !field.defaultValue || !isNode(field.defaultValue, VALUE_NODES)) {
|
|
319
261
|
return null;
|
|
320
262
|
}
|
|
321
263
|
const name = camelCase(`${prefix}_${discriminatorNode.name}`);
|
|
322
|
-
const typeManifest =
|
|
264
|
+
const typeManifest = visit(field.type, typeManifestVisitor);
|
|
323
265
|
const value = renderValueNode(field.defaultValue, getImportFrom);
|
|
324
266
|
return getConstant(name, typeManifest, value);
|
|
325
267
|
}
|
|
@@ -327,9 +269,6 @@ function getConstant(name, typeManifest, value) {
|
|
|
327
269
|
const type = { imports: typeManifest.imports, render: typeManifest.type };
|
|
328
270
|
return mergeFragments([type, value], ([t, v]) => `pub const ${snakeCase(name).toUpperCase()}: ${t} = ${v};`);
|
|
329
271
|
}
|
|
330
|
-
|
|
331
|
-
// src/utils/linkOverrides.ts
|
|
332
|
-
import { CODAMA_ERROR__UNEXPECTED_NODE_KIND, CodamaError } from "@codama/errors";
|
|
333
272
|
function getImportFromFactory(overrides) {
|
|
334
273
|
const linkOverrides = {
|
|
335
274
|
accounts: overrides.accounts ?? {},
|
|
@@ -370,12 +309,6 @@ function getImportFromFactory(overrides) {
|
|
|
370
309
|
}
|
|
371
310
|
};
|
|
372
311
|
}
|
|
373
|
-
|
|
374
|
-
// src/utils/render.ts
|
|
375
|
-
import { dirname as pathDirname, join } from "path";
|
|
376
|
-
import { fileURLToPath } from "url";
|
|
377
|
-
import { camelCase as camelCase2, kebabCase, pascalCase as pascalCase2, snakeCase as snakeCase2, titleCase } from "@codama/nodes";
|
|
378
|
-
import nunjucks from "nunjucks";
|
|
379
312
|
function rustDocblock(docs) {
|
|
380
313
|
if (docs.length <= 0) return "";
|
|
381
314
|
const lines = docs.map((doc) => `/// ${doc}`);
|
|
@@ -383,12 +316,12 @@ function rustDocblock(docs) {
|
|
|
383
316
|
`;
|
|
384
317
|
}
|
|
385
318
|
var render = (template, context, options) => {
|
|
386
|
-
const dirname =
|
|
387
|
-
const templates =
|
|
319
|
+
const dirname$1 = dirname(fileURLToPath(import.meta.url)) ;
|
|
320
|
+
const templates = join(dirname$1, "templates");
|
|
388
321
|
const env = nunjucks.configure(templates, { autoescape: false, trimBlocks: true, ...options });
|
|
389
|
-
env.addFilter("pascalCase",
|
|
390
|
-
env.addFilter("camelCase",
|
|
391
|
-
env.addFilter("snakeCase",
|
|
322
|
+
env.addFilter("pascalCase", pascalCase);
|
|
323
|
+
env.addFilter("camelCase", camelCase);
|
|
324
|
+
env.addFilter("snakeCase", snakeCase);
|
|
392
325
|
env.addFilter("kebabCase", kebabCase);
|
|
393
326
|
env.addFilter("titleCase", titleCase);
|
|
394
327
|
env.addFilter("rustDocblock", rustDocblock);
|
|
@@ -398,14 +331,6 @@ var render = (template, context, options) => {
|
|
|
398
331
|
});
|
|
399
332
|
return env.render(template, context);
|
|
400
333
|
};
|
|
401
|
-
|
|
402
|
-
// src/utils/traitOptions.ts
|
|
403
|
-
import {
|
|
404
|
-
assertIsNode,
|
|
405
|
-
camelCase as camelCase3,
|
|
406
|
-
isNode as isNode3,
|
|
407
|
-
isScalarEnum
|
|
408
|
-
} from "@codama/nodes";
|
|
409
334
|
var DEFAULT_TRAIT_OPTIONS = {
|
|
410
335
|
baseDefaults: [
|
|
411
336
|
"borsh::BorshSerialize",
|
|
@@ -435,7 +360,7 @@ function getTraitsFromNode(node, userOptions = {}) {
|
|
|
435
360
|
return { imports: new ImportMap(), render: "" };
|
|
436
361
|
}
|
|
437
362
|
const sanitizedOverrides = Object.fromEntries(
|
|
438
|
-
Object.entries(options.overrides).map(([key, value]) => [
|
|
363
|
+
Object.entries(options.overrides).map(([key, value]) => [camelCase(key), value])
|
|
439
364
|
);
|
|
440
365
|
const nodeOverrides = sanitizedOverrides[node.name];
|
|
441
366
|
const allTraits = nodeOverrides === void 0 ? getDefaultTraits(nodeType, options) : nodeOverrides;
|
|
@@ -457,9 +382,9 @@ function getTraitsFromNode(node, userOptions = {}) {
|
|
|
457
382
|
return { imports, render: traitLines.join("") };
|
|
458
383
|
}
|
|
459
384
|
function getNodeType(node) {
|
|
460
|
-
if (
|
|
461
|
-
if (
|
|
462
|
-
if (
|
|
385
|
+
if (isNode(node, ["accountNode", "instructionNode"])) return "struct";
|
|
386
|
+
if (isNode(node.type, "structTypeNode")) return "struct";
|
|
387
|
+
if (isNode(node.type, "enumTypeNode")) {
|
|
463
388
|
return isScalarEnum(node.type) ? "scalarEnum" : "dataEnum";
|
|
464
389
|
}
|
|
465
390
|
return "alias";
|
|
@@ -513,7 +438,7 @@ function getSerdeFieldAttribute(serdeWith, node, userOptions = {}) {
|
|
|
513
438
|
return "";
|
|
514
439
|
}
|
|
515
440
|
const sanitizedOverrides = Object.fromEntries(
|
|
516
|
-
Object.entries(options.overrides).map(([key, value]) => [
|
|
441
|
+
Object.entries(options.overrides).map(([key, value]) => [camelCase(key), value])
|
|
517
442
|
);
|
|
518
443
|
const nodeOverrides = sanitizedOverrides[node.name];
|
|
519
444
|
const allTraits = nodeOverrides === void 0 ? getDefaultTraits(nodeType, options) : nodeOverrides;
|
|
@@ -561,9 +486,9 @@ function getTypeManifestVisitor(options) {
|
|
|
561
486
|
),
|
|
562
487
|
(v) => extendVisitor(v, {
|
|
563
488
|
visitAccount(account, { self }) {
|
|
564
|
-
parentName =
|
|
489
|
+
parentName = pascalCase(account.name);
|
|
565
490
|
parentNode = account;
|
|
566
|
-
const manifest =
|
|
491
|
+
const manifest = visit(account.data, self);
|
|
567
492
|
const traits = getTraitsFromNode2(account);
|
|
568
493
|
manifest.imports.mergeWith(traits.imports);
|
|
569
494
|
parentName = null;
|
|
@@ -574,14 +499,14 @@ function getTypeManifestVisitor(options) {
|
|
|
574
499
|
};
|
|
575
500
|
},
|
|
576
501
|
visitArrayType(arrayType, { self }) {
|
|
577
|
-
const childManifest =
|
|
578
|
-
if (
|
|
502
|
+
const childManifest = visit(arrayType.item, self);
|
|
503
|
+
if (isNode(arrayType.count, "fixedCountNode")) {
|
|
579
504
|
return {
|
|
580
505
|
...childManifest,
|
|
581
506
|
type: `[${childManifest.type}; ${arrayType.count.value}]`
|
|
582
507
|
};
|
|
583
508
|
}
|
|
584
|
-
if (
|
|
509
|
+
if (isNode(arrayType.count, "remainderCountNode")) {
|
|
585
510
|
childManifest.imports.add("kaigan::types::RemainderVec");
|
|
586
511
|
return {
|
|
587
512
|
...childManifest,
|
|
@@ -638,21 +563,21 @@ function getTypeManifestVisitor(options) {
|
|
|
638
563
|
arraySize = prefixedCountNode(parentSize);
|
|
639
564
|
}
|
|
640
565
|
const arrayType = arrayTypeNode(numberTypeNode("u8"), arraySize);
|
|
641
|
-
return
|
|
566
|
+
return visit(arrayType, self);
|
|
642
567
|
},
|
|
643
568
|
visitDefinedType(definedType, { self }) {
|
|
644
|
-
parentName =
|
|
569
|
+
parentName = pascalCase(definedType.name);
|
|
645
570
|
parentNode = definedType;
|
|
646
|
-
const manifest =
|
|
571
|
+
const manifest = visit(definedType.type, self);
|
|
647
572
|
const traits = getTraitsFromNode2(definedType);
|
|
648
573
|
manifest.imports.mergeWith(traits.imports);
|
|
649
574
|
parentName = null;
|
|
650
575
|
parentNode = null;
|
|
651
|
-
const renderedType =
|
|
576
|
+
const renderedType = isNode(definedType.type, ["enumTypeNode", "structTypeNode"]) ? manifest.type : `pub type ${pascalCase(definedType.name)} = ${manifest.type};`;
|
|
652
577
|
return { ...manifest, type: `${traits.render}${renderedType}` };
|
|
653
578
|
},
|
|
654
579
|
visitDefinedTypeLink(node) {
|
|
655
|
-
const pascalCaseDefinedType =
|
|
580
|
+
const pascalCaseDefinedType = pascalCase(node.name);
|
|
656
581
|
const importFrom = getImportFrom(node);
|
|
657
582
|
return {
|
|
658
583
|
imports: new ImportMap().add(`${importFrom}::${pascalCaseDefinedType}`),
|
|
@@ -661,7 +586,7 @@ function getTypeManifestVisitor(options) {
|
|
|
661
586
|
};
|
|
662
587
|
},
|
|
663
588
|
visitEnumEmptyVariantType(enumEmptyVariantType) {
|
|
664
|
-
const name =
|
|
589
|
+
const name = pascalCase(enumEmptyVariantType.name);
|
|
665
590
|
return {
|
|
666
591
|
imports: new ImportMap(),
|
|
667
592
|
nestedStructs: [],
|
|
@@ -669,14 +594,14 @@ function getTypeManifestVisitor(options) {
|
|
|
669
594
|
};
|
|
670
595
|
},
|
|
671
596
|
visitEnumStructVariantType(enumStructVariantType, { self }) {
|
|
672
|
-
const name =
|
|
597
|
+
const name = pascalCase(enumStructVariantType.name);
|
|
673
598
|
const originalParentName = parentName;
|
|
674
599
|
if (!originalParentName) {
|
|
675
600
|
throw new Error("Enum struct variant type must have a parent name.");
|
|
676
601
|
}
|
|
677
602
|
inlineStruct = true;
|
|
678
|
-
parentName =
|
|
679
|
-
const typeManifest =
|
|
603
|
+
parentName = pascalCase(originalParentName) + name;
|
|
604
|
+
const typeManifest = visit(enumStructVariantType.struct, self);
|
|
680
605
|
inlineStruct = false;
|
|
681
606
|
parentName = originalParentName;
|
|
682
607
|
return {
|
|
@@ -685,13 +610,13 @@ function getTypeManifestVisitor(options) {
|
|
|
685
610
|
};
|
|
686
611
|
},
|
|
687
612
|
visitEnumTupleVariantType(enumTupleVariantType, { self }) {
|
|
688
|
-
const name =
|
|
613
|
+
const name = pascalCase(enumTupleVariantType.name);
|
|
689
614
|
const originalParentName = parentName;
|
|
690
615
|
if (!originalParentName) {
|
|
691
616
|
throw new Error("Enum struct variant type must have a parent name.");
|
|
692
617
|
}
|
|
693
|
-
parentName =
|
|
694
|
-
const childManifest =
|
|
618
|
+
parentName = pascalCase(originalParentName) + name;
|
|
619
|
+
const childManifest = visit(enumTupleVariantType.tuple, self);
|
|
695
620
|
parentName = originalParentName;
|
|
696
621
|
let derive = "";
|
|
697
622
|
if (parentNode && childManifest.type === "(Pubkey)") {
|
|
@@ -717,25 +642,25 @@ function getTypeManifestVisitor(options) {
|
|
|
717
642
|
if (!originalParentName) {
|
|
718
643
|
throw new Error("Enum type must have a parent name.");
|
|
719
644
|
}
|
|
720
|
-
const variants = enumType.variants.map((variant) =>
|
|
645
|
+
const variants = enumType.variants.map((variant) => visit(variant, self));
|
|
721
646
|
const variantNames = variants.map((variant) => variant.type).join("\n");
|
|
722
647
|
const mergedManifest = mergeManifests(variants);
|
|
723
648
|
return {
|
|
724
649
|
...mergedManifest,
|
|
725
|
-
type: `pub enum ${
|
|
650
|
+
type: `pub enum ${pascalCase(originalParentName)} {
|
|
726
651
|
${variantNames}
|
|
727
652
|
}`
|
|
728
653
|
};
|
|
729
654
|
},
|
|
730
655
|
visitFixedSizeType(fixedSizeType, { self }) {
|
|
731
656
|
parentSize = fixedSizeType.size;
|
|
732
|
-
const manifest =
|
|
657
|
+
const manifest = visit(fixedSizeType.type, self);
|
|
733
658
|
parentSize = null;
|
|
734
659
|
return manifest;
|
|
735
660
|
},
|
|
736
661
|
visitMapType(mapType, { self }) {
|
|
737
|
-
const key =
|
|
738
|
-
const value =
|
|
662
|
+
const key = visit(mapType.key, self);
|
|
663
|
+
const value = visit(mapType.value, self);
|
|
739
664
|
const mergedManifest = mergeManifests([key, value]);
|
|
740
665
|
mergedManifest.imports.add("std::collections::HashMap");
|
|
741
666
|
return {
|
|
@@ -761,7 +686,7 @@ ${variantNames}
|
|
|
761
686
|
};
|
|
762
687
|
},
|
|
763
688
|
visitOptionType(optionType, { self }) {
|
|
764
|
-
const childManifest =
|
|
689
|
+
const childManifest = visit(optionType.item, self);
|
|
765
690
|
const optionPrefix = resolveNestedTypeNode(optionType.prefix);
|
|
766
691
|
if (optionPrefix.format === "u8" && optionPrefix.endian === "le") {
|
|
767
692
|
return {
|
|
@@ -779,10 +704,10 @@ ${variantNames}
|
|
|
779
704
|
};
|
|
780
705
|
},
|
|
781
706
|
visitRemainderOptionType(node) {
|
|
782
|
-
throw new
|
|
707
|
+
throw new CodamaError(CODAMA_ERROR__RENDERERS__UNSUPPORTED_NODE, { kind: node.kind, node });
|
|
783
708
|
},
|
|
784
709
|
visitSetType(setType, { self }) {
|
|
785
|
-
const childManifest =
|
|
710
|
+
const childManifest = visit(setType.item, self);
|
|
786
711
|
childManifest.imports.add("std::collections::HashSet");
|
|
787
712
|
return {
|
|
788
713
|
...childManifest,
|
|
@@ -791,7 +716,7 @@ ${variantNames}
|
|
|
791
716
|
},
|
|
792
717
|
visitSizePrefixType(sizePrefixType, { self }) {
|
|
793
718
|
parentSize = resolveNestedTypeNode(sizePrefixType.prefix);
|
|
794
|
-
const manifest =
|
|
719
|
+
const manifest = visit(sizePrefixType.type, self);
|
|
795
720
|
parentSize = null;
|
|
796
721
|
return manifest;
|
|
797
722
|
},
|
|
@@ -810,7 +735,7 @@ ${variantNames}
|
|
|
810
735
|
type: `[u8; ${parentSize}]`
|
|
811
736
|
};
|
|
812
737
|
}
|
|
813
|
-
if (
|
|
738
|
+
if (isNode(parentSize, "numberTypeNode") && parentSize.endian === "le") {
|
|
814
739
|
switch (parentSize.format) {
|
|
815
740
|
case "u32":
|
|
816
741
|
return {
|
|
@@ -841,14 +766,14 @@ ${variantNames}
|
|
|
841
766
|
if (!originalParentName) {
|
|
842
767
|
throw new Error("Struct field type must have a parent name.");
|
|
843
768
|
}
|
|
844
|
-
parentName =
|
|
769
|
+
parentName = pascalCase(originalParentName) + pascalCase(structFieldType.name);
|
|
845
770
|
nestedStruct = true;
|
|
846
771
|
inlineStruct = false;
|
|
847
|
-
const fieldManifest =
|
|
772
|
+
const fieldManifest = visit(structFieldType.type, self);
|
|
848
773
|
parentName = originalParentName;
|
|
849
774
|
inlineStruct = originalInlineStruct;
|
|
850
775
|
nestedStruct = originalNestedStruct;
|
|
851
|
-
const fieldName =
|
|
776
|
+
const fieldName = snakeCase(structFieldType.name);
|
|
852
777
|
const docblock = rustDocblock(parseDocs(structFieldType.docs));
|
|
853
778
|
const resolvedNestedType = resolveNestedTypeNode(structFieldType.type);
|
|
854
779
|
let derive = "";
|
|
@@ -865,9 +790,9 @@ ${variantNames}
|
|
|
865
790
|
parentNode,
|
|
866
791
|
traitOptions
|
|
867
792
|
);
|
|
868
|
-
} else if (
|
|
793
|
+
} else if (isNode(resolvedNestedType, "arrayTypeNode") && isNode(resolvedNestedType.count, "fixedCountNode") && resolvedNestedType.count.value > 32) {
|
|
869
794
|
derive = getSerdeFieldAttribute("serde_big_array::BigArray", parentNode, traitOptions);
|
|
870
|
-
} else if (
|
|
795
|
+
} else if (isNode(resolvedNestedType, ["bytesTypeNode", "stringTypeNode"]) && isNode(structFieldType.type, "fixedSizeTypeNode") && structFieldType.type.size > 32) {
|
|
871
796
|
derive = getSerdeFieldAttribute(
|
|
872
797
|
"serde_with::As::<serde_with::Bytes>",
|
|
873
798
|
parentNode,
|
|
@@ -885,7 +810,7 @@ ${variantNames}
|
|
|
885
810
|
if (!originalParentName) {
|
|
886
811
|
throw new Error("Struct type must have a parent name.");
|
|
887
812
|
}
|
|
888
|
-
const fields = structType.fields.map((field) =>
|
|
813
|
+
const fields = structType.fields.map((field) => visit(field, self));
|
|
889
814
|
const fieldTypes = fields.map((field) => field.type).join("\n");
|
|
890
815
|
const mergedManifest = mergeManifests(fields);
|
|
891
816
|
if (nestedStruct) {
|
|
@@ -897,11 +822,11 @@ ${variantNames}
|
|
|
897
822
|
...mergedManifest,
|
|
898
823
|
nestedStructs: [
|
|
899
824
|
...mergedManifest.nestedStructs,
|
|
900
|
-
`${nestedTraits.render}pub struct ${
|
|
825
|
+
`${nestedTraits.render}pub struct ${pascalCase(originalParentName)} {
|
|
901
826
|
${fieldTypes}
|
|
902
827
|
}`
|
|
903
828
|
],
|
|
904
|
-
type:
|
|
829
|
+
type: pascalCase(originalParentName)
|
|
905
830
|
};
|
|
906
831
|
}
|
|
907
832
|
if (inlineStruct) {
|
|
@@ -911,13 +836,13 @@ ${fieldTypes}
|
|
|
911
836
|
}
|
|
912
837
|
return {
|
|
913
838
|
...mergedManifest,
|
|
914
|
-
type: `pub struct ${
|
|
839
|
+
type: `pub struct ${pascalCase(originalParentName)} {
|
|
915
840
|
${fieldTypes}
|
|
916
841
|
}`
|
|
917
842
|
};
|
|
918
843
|
},
|
|
919
844
|
visitTupleType(tupleType, { self }) {
|
|
920
|
-
const items = tupleType.items.map((item) =>
|
|
845
|
+
const items = tupleType.items.map((item) => visit(item, self));
|
|
921
846
|
const mergedManifest = mergeManifests(items);
|
|
922
847
|
return {
|
|
923
848
|
...mergedManifest,
|
|
@@ -925,7 +850,7 @@ ${fieldTypes}
|
|
|
925
850
|
};
|
|
926
851
|
},
|
|
927
852
|
visitZeroableOptionType(node) {
|
|
928
|
-
throw new
|
|
853
|
+
throw new CodamaError(CODAMA_ERROR__RENDERERS__UNSUPPORTED_NODE, { kind: node.kind, node });
|
|
929
854
|
}
|
|
930
855
|
})
|
|
931
856
|
);
|
|
@@ -952,14 +877,14 @@ function getRenderMapVisitor(options = {}) {
|
|
|
952
877
|
traitOptions: options.traitOptions
|
|
953
878
|
});
|
|
954
879
|
const anchorTraits = options.anchorTraits ?? true;
|
|
955
|
-
return
|
|
880
|
+
return pipe(
|
|
956
881
|
staticVisitor(() => createRenderMap(), {
|
|
957
882
|
keys: ["rootNode", "programNode", "instructionNode", "accountNode", "definedTypeNode"]
|
|
958
883
|
}),
|
|
959
|
-
(v) =>
|
|
884
|
+
(v) => extendVisitor(v, {
|
|
960
885
|
visitAccount(node) {
|
|
961
|
-
const typeManifest =
|
|
962
|
-
const fields =
|
|
886
|
+
const typeManifest = visit(node, typeManifestVisitor);
|
|
887
|
+
const fields = resolveNestedTypeNode(node.data).fields;
|
|
963
888
|
const discriminatorConstants = getDiscriminatorConstants({
|
|
964
889
|
discriminatorNodes: node.discriminators ?? [],
|
|
965
890
|
fields,
|
|
@@ -971,54 +896,52 @@ function getRenderMapVisitor(options = {}) {
|
|
|
971
896
|
const pda = node.pda ? linkables.get([...stack.getPath(), node.pda]) : void 0;
|
|
972
897
|
const pdaSeeds = pda?.seeds ?? [];
|
|
973
898
|
const seeds = pdaSeeds.map((seed) => {
|
|
974
|
-
if (
|
|
975
|
-
const seedManifest2 =
|
|
899
|
+
if (isNode(seed, "variablePdaSeedNode")) {
|
|
900
|
+
const seedManifest2 = visit(seed.type, typeManifestVisitor);
|
|
976
901
|
seedsImports.mergeWith(seedManifest2.imports);
|
|
977
|
-
const resolvedType2 =
|
|
902
|
+
const resolvedType2 = resolveNestedTypeNode(seed.type);
|
|
978
903
|
return { ...seed, resolvedType: resolvedType2, typeManifest: seedManifest2 };
|
|
979
904
|
}
|
|
980
|
-
if (
|
|
905
|
+
if (isNode(seed.value, "programIdValueNode")) {
|
|
981
906
|
return seed;
|
|
982
907
|
}
|
|
983
|
-
const seedManifest =
|
|
908
|
+
const seedManifest = visit(seed.type, typeManifestVisitor);
|
|
984
909
|
const valueManifest = renderValueNode(seed.value, getImportFrom, true);
|
|
985
910
|
seedsImports.mergeWith(valueManifest.imports);
|
|
986
|
-
const resolvedType =
|
|
911
|
+
const resolvedType = resolveNestedTypeNode(seed.type);
|
|
987
912
|
return { ...seed, resolvedType, typeManifest: seedManifest, valueManifest };
|
|
988
913
|
});
|
|
989
|
-
const hasVariableSeeds = pdaSeeds.filter(
|
|
990
|
-
const constantSeeds = seeds.filter(
|
|
914
|
+
const hasVariableSeeds = pdaSeeds.filter(isNodeFilter("variablePdaSeedNode")).length > 0;
|
|
915
|
+
const constantSeeds = seeds.filter(isNodeFilter("constantPdaSeedNode")).filter((seed) => !isNode(seed.value, "programIdValueNode"));
|
|
991
916
|
const { imports } = typeManifest;
|
|
992
917
|
if (hasVariableSeeds) {
|
|
993
918
|
imports.mergeWith(seedsImports);
|
|
994
919
|
}
|
|
995
|
-
return createRenderMap(
|
|
996
|
-
|
|
997
|
-
render("accountsPage.njk", {
|
|
920
|
+
return createRenderMap(`accounts/${snakeCase(node.name)}.rs`, {
|
|
921
|
+
content: render("accountsPage.njk", {
|
|
998
922
|
account: node,
|
|
999
923
|
anchorTraits,
|
|
1000
924
|
constantSeeds,
|
|
1001
925
|
discriminatorConstants: discriminatorConstants.render,
|
|
1002
926
|
hasVariableSeeds,
|
|
1003
|
-
imports: imports.mergeWith(discriminatorConstants.imports).remove(`generatedAccounts::${
|
|
927
|
+
imports: imports.mergeWith(discriminatorConstants.imports).remove(`generatedAccounts::${pascalCase(node.name)}`).toString(dependencyMap),
|
|
1004
928
|
pda,
|
|
1005
929
|
program,
|
|
1006
930
|
seeds,
|
|
1007
931
|
typeManifest
|
|
1008
932
|
})
|
|
1009
|
-
);
|
|
933
|
+
});
|
|
1010
934
|
},
|
|
1011
935
|
visitDefinedType(node) {
|
|
1012
|
-
const typeManifest =
|
|
936
|
+
const typeManifest = visit(node, typeManifestVisitor);
|
|
1013
937
|
const imports = new ImportMap().mergeWithManifest(typeManifest);
|
|
1014
|
-
return createRenderMap(
|
|
1015
|
-
|
|
1016
|
-
render("definedTypesPage.njk", {
|
|
938
|
+
return createRenderMap(`types/${snakeCase(node.name)}.rs`, {
|
|
939
|
+
content: render("definedTypesPage.njk", {
|
|
1017
940
|
definedType: node,
|
|
1018
|
-
imports: imports.remove(`generatedTypes::${
|
|
941
|
+
imports: imports.remove(`generatedTypes::${pascalCase(node.name)}`).toString(dependencyMap),
|
|
1019
942
|
typeManifest
|
|
1020
943
|
})
|
|
1021
|
-
);
|
|
944
|
+
});
|
|
1022
945
|
},
|
|
1023
946
|
visitInstruction(node) {
|
|
1024
947
|
const imports = new ImportMap();
|
|
@@ -1043,12 +966,12 @@ function getRenderMapVisitor(options = {}) {
|
|
|
1043
966
|
getImportFrom,
|
|
1044
967
|
getTraitsFromNode: getTraitsFromNode2,
|
|
1045
968
|
nestedStruct: true,
|
|
1046
|
-
parentName: `${
|
|
969
|
+
parentName: `${pascalCase(node.name)}InstructionData`
|
|
1047
970
|
});
|
|
1048
|
-
const manifest =
|
|
971
|
+
const manifest = visit(argument.type, argumentVisitor);
|
|
1049
972
|
imports.mergeWith(manifest.imports);
|
|
1050
|
-
const innerOptionType =
|
|
1051
|
-
const hasDefaultValue = !!argument.defaultValue &&
|
|
973
|
+
const innerOptionType = isNode(argument.type, "optionTypeNode") ? manifest.type.slice("Option<".length, -1) : null;
|
|
974
|
+
const hasDefaultValue = !!argument.defaultValue && isNode(argument.defaultValue, VALUE_NODES);
|
|
1052
975
|
let renderValue = null;
|
|
1053
976
|
if (hasDefaultValue) {
|
|
1054
977
|
const { imports: argImports, render: value } = renderValueNode(
|
|
@@ -1074,45 +997,42 @@ function getRenderMapVisitor(options = {}) {
|
|
|
1074
997
|
const structVisitor = getTypeManifestVisitor({
|
|
1075
998
|
getImportFrom,
|
|
1076
999
|
getTraitsFromNode: getTraitsFromNode2,
|
|
1077
|
-
parentName: `${
|
|
1000
|
+
parentName: `${pascalCase(node.name)}InstructionData`
|
|
1078
1001
|
});
|
|
1079
|
-
const typeManifest =
|
|
1002
|
+
const typeManifest = visit(struct, structVisitor);
|
|
1080
1003
|
const dataTraits = getTraitsFromNode2(node);
|
|
1081
1004
|
imports.mergeWith(dataTraits.imports);
|
|
1082
|
-
return createRenderMap(
|
|
1083
|
-
|
|
1084
|
-
render("instructionsPage.njk", {
|
|
1005
|
+
return createRenderMap(`instructions/${snakeCase(node.name)}.rs`, {
|
|
1006
|
+
content: render("instructionsPage.njk", {
|
|
1085
1007
|
dataTraits: dataTraits.render,
|
|
1086
1008
|
discriminatorConstants: discriminatorConstants.render,
|
|
1087
1009
|
hasArgs,
|
|
1088
1010
|
hasOptional,
|
|
1089
|
-
imports: imports.mergeWith(discriminatorConstants.imports).remove(`generatedInstructions::${
|
|
1011
|
+
imports: imports.mergeWith(discriminatorConstants.imports).remove(`generatedInstructions::${pascalCase(node.name)}`).toString(dependencyMap),
|
|
1090
1012
|
instruction: node,
|
|
1091
1013
|
instructionArgs,
|
|
1092
1014
|
program,
|
|
1093
1015
|
typeManifest
|
|
1094
1016
|
})
|
|
1095
|
-
);
|
|
1017
|
+
});
|
|
1096
1018
|
},
|
|
1097
1019
|
visitProgram(node, { self }) {
|
|
1098
1020
|
program = node;
|
|
1099
1021
|
let renders = mergeRenderMaps([
|
|
1100
|
-
...node.accounts.map((account) =>
|
|
1101
|
-
...node.definedTypes.map((type) =>
|
|
1022
|
+
...node.accounts.map((account) => visit(account, self)),
|
|
1023
|
+
...node.definedTypes.map((type) => visit(type, self)),
|
|
1102
1024
|
...getAllInstructionsWithSubs(node, {
|
|
1103
1025
|
leavesOnly: !renderParentInstructions
|
|
1104
|
-
}).map((ix) =>
|
|
1026
|
+
}).map((ix) => visit(ix, self))
|
|
1105
1027
|
]);
|
|
1106
1028
|
if (node.errors.length > 0) {
|
|
1107
|
-
renders = addToRenderMap(
|
|
1108
|
-
|
|
1109
|
-
`errors/${snakeCase4(node.name)}.rs`,
|
|
1110
|
-
render("errorsPage.njk", {
|
|
1029
|
+
renders = addToRenderMap(renders, `errors/${snakeCase(node.name)}.rs`, {
|
|
1030
|
+
content: render("errorsPage.njk", {
|
|
1111
1031
|
errors: node.errors,
|
|
1112
1032
|
imports: new ImportMap().toString(dependencyMap),
|
|
1113
1033
|
program: node
|
|
1114
1034
|
})
|
|
1115
|
-
);
|
|
1035
|
+
});
|
|
1116
1036
|
}
|
|
1117
1037
|
program = null;
|
|
1118
1038
|
return renders;
|
|
@@ -1135,15 +1055,15 @@ function getRenderMapVisitor(options = {}) {
|
|
|
1135
1055
|
};
|
|
1136
1056
|
return mergeRenderMaps([
|
|
1137
1057
|
createRenderMap({
|
|
1138
|
-
["accounts/mod.rs"]: accountsToExport.length > 0 ? render("accountsMod.njk", ctx) : void 0,
|
|
1139
|
-
["errors/mod.rs"]: programsToExport.length > 0 ? render("errorsMod.njk", ctx) : void 0,
|
|
1140
|
-
["instructions/mod.rs"]: instructionsToExport.length > 0 ? render("instructionsMod.njk", ctx) : void 0,
|
|
1141
|
-
["mod.rs"]: render("rootMod.njk", ctx),
|
|
1142
|
-
["programs.rs"]: programsToExport.length > 0 ? render("programsMod.njk", ctx) : void 0,
|
|
1143
|
-
["shared.rs"]: accountsToExport.length > 0 ? render("sharedPage.njk", ctx) : void 0,
|
|
1144
|
-
["types/mod.rs"]: definedTypesToExport.length > 0 ? render("definedTypesMod.njk", ctx) : void 0
|
|
1058
|
+
["accounts/mod.rs"]: accountsToExport.length > 0 ? { content: render("accountsMod.njk", ctx) } : void 0,
|
|
1059
|
+
["errors/mod.rs"]: programsToExport.length > 0 ? { content: render("errorsMod.njk", ctx) } : void 0,
|
|
1060
|
+
["instructions/mod.rs"]: instructionsToExport.length > 0 ? { content: render("instructionsMod.njk", ctx) } : void 0,
|
|
1061
|
+
["mod.rs"]: { content: render("rootMod.njk", ctx) },
|
|
1062
|
+
["programs.rs"]: programsToExport.length > 0 ? { content: render("programsMod.njk", ctx) } : void 0,
|
|
1063
|
+
["shared.rs"]: accountsToExport.length > 0 ? { content: render("sharedPage.njk", ctx) } : void 0,
|
|
1064
|
+
["types/mod.rs"]: definedTypesToExport.length > 0 ? { content: render("definedTypesMod.njk", ctx) } : void 0
|
|
1145
1065
|
}),
|
|
1146
|
-
...getAllPrograms(node).map((p) =>
|
|
1066
|
+
...getAllPrograms(node).map((p) => visit(p, self))
|
|
1147
1067
|
]);
|
|
1148
1068
|
}
|
|
1149
1069
|
}),
|
|
@@ -1159,18 +1079,12 @@ function getConflictsForInstructionAccountsAndArgs(instruction) {
|
|
|
1159
1079
|
const duplicates = allNames.filter((e, i, a) => a.indexOf(e) !== i);
|
|
1160
1080
|
return [...new Set(duplicates)];
|
|
1161
1081
|
}
|
|
1162
|
-
|
|
1163
|
-
// src/renderVisitor.ts
|
|
1164
|
-
import { logError, logWarn as logWarn2 } from "@codama/errors";
|
|
1165
|
-
import { deleteDirectory, writeRenderMapVisitor } from "@codama/renderers-core";
|
|
1166
|
-
import { rootNodeVisitor, visit as visit5 } from "@codama/visitors-core";
|
|
1167
|
-
import { spawnSync } from "child_process";
|
|
1168
1082
|
function renderVisitor(path, options = {}) {
|
|
1169
1083
|
return rootNodeVisitor((root) => {
|
|
1170
1084
|
if (options.deleteFolderBeforeRendering ?? true) {
|
|
1171
1085
|
deleteDirectory(path);
|
|
1172
1086
|
}
|
|
1173
|
-
|
|
1087
|
+
visit(root, writeRenderMapVisitor(getRenderMapVisitor(options), path));
|
|
1174
1088
|
if (options.formatCode) {
|
|
1175
1089
|
if (options.crateFolder) {
|
|
1176
1090
|
const removeFalsy = (arg) => Boolean(arg);
|
|
@@ -1181,7 +1095,7 @@ function renderVisitor(path, options = {}) {
|
|
|
1181
1095
|
)
|
|
1182
1096
|
);
|
|
1183
1097
|
} else {
|
|
1184
|
-
|
|
1098
|
+
logWarn("No crate folder specified, skipping formatting.");
|
|
1185
1099
|
}
|
|
1186
1100
|
}
|
|
1187
1101
|
});
|
|
@@ -1189,21 +1103,17 @@ function renderVisitor(path, options = {}) {
|
|
|
1189
1103
|
function runFormatter(cmd, args) {
|
|
1190
1104
|
const { stdout, stderr, error } = spawnSync(cmd, args);
|
|
1191
1105
|
if (error?.message?.includes("ENOENT")) {
|
|
1192
|
-
|
|
1106
|
+
logWarn(`Could not find ${cmd}, skipping formatting.`);
|
|
1193
1107
|
return;
|
|
1194
1108
|
}
|
|
1195
1109
|
if (stdout.length > 0) {
|
|
1196
|
-
|
|
1110
|
+
logWarn(`(cargo-fmt) ${stdout ? stdout?.toString() : error}`);
|
|
1197
1111
|
}
|
|
1198
1112
|
if (stderr.length > 0) {
|
|
1199
1113
|
logError(`(cargo-fmt) ${stderr ? stderr.toString() : error}`);
|
|
1200
1114
|
}
|
|
1201
1115
|
}
|
|
1202
|
-
|
|
1203
|
-
|
|
1204
|
-
|
|
1205
|
-
getRenderMapVisitor,
|
|
1206
|
-
getTypeManifestVisitor,
|
|
1207
|
-
renderVisitor
|
|
1208
|
-
};
|
|
1116
|
+
|
|
1117
|
+
export { ImportMap, renderVisitor as default, getRenderMapVisitor, getTypeManifestVisitor, renderVisitor };
|
|
1118
|
+
//# sourceMappingURL=index.node.mjs.map
|
|
1209
1119
|
//# sourceMappingURL=index.node.mjs.map
|