@codama/renderers-rust 1.2.8 → 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 +178 -240
- package/dist/index.node.cjs.map +1 -1
- package/dist/index.node.mjs +98 -183
- package/dist/index.node.mjs.map +1 -1
- package/package.json +6 -6
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,35 +896,35 @@ 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(`accounts/${
|
|
920
|
+
return createRenderMap(`accounts/${snakeCase(node.name)}.rs`, {
|
|
996
921
|
content: render("accountsPage.njk", {
|
|
997
922
|
account: node,
|
|
998
923
|
anchorTraits,
|
|
999
924
|
constantSeeds,
|
|
1000
925
|
discriminatorConstants: discriminatorConstants.render,
|
|
1001
926
|
hasVariableSeeds,
|
|
1002
|
-
imports: imports.mergeWith(discriminatorConstants.imports).remove(`generatedAccounts::${
|
|
927
|
+
imports: imports.mergeWith(discriminatorConstants.imports).remove(`generatedAccounts::${pascalCase(node.name)}`).toString(dependencyMap),
|
|
1003
928
|
pda,
|
|
1004
929
|
program,
|
|
1005
930
|
seeds,
|
|
@@ -1008,12 +933,12 @@ function getRenderMapVisitor(options = {}) {
|
|
|
1008
933
|
});
|
|
1009
934
|
},
|
|
1010
935
|
visitDefinedType(node) {
|
|
1011
|
-
const typeManifest =
|
|
936
|
+
const typeManifest = visit(node, typeManifestVisitor);
|
|
1012
937
|
const imports = new ImportMap().mergeWithManifest(typeManifest);
|
|
1013
|
-
return createRenderMap(`types/${
|
|
938
|
+
return createRenderMap(`types/${snakeCase(node.name)}.rs`, {
|
|
1014
939
|
content: render("definedTypesPage.njk", {
|
|
1015
940
|
definedType: node,
|
|
1016
|
-
imports: imports.remove(`generatedTypes::${
|
|
941
|
+
imports: imports.remove(`generatedTypes::${pascalCase(node.name)}`).toString(dependencyMap),
|
|
1017
942
|
typeManifest
|
|
1018
943
|
})
|
|
1019
944
|
});
|
|
@@ -1041,12 +966,12 @@ function getRenderMapVisitor(options = {}) {
|
|
|
1041
966
|
getImportFrom,
|
|
1042
967
|
getTraitsFromNode: getTraitsFromNode2,
|
|
1043
968
|
nestedStruct: true,
|
|
1044
|
-
parentName: `${
|
|
969
|
+
parentName: `${pascalCase(node.name)}InstructionData`
|
|
1045
970
|
});
|
|
1046
|
-
const manifest =
|
|
971
|
+
const manifest = visit(argument.type, argumentVisitor);
|
|
1047
972
|
imports.mergeWith(manifest.imports);
|
|
1048
|
-
const innerOptionType =
|
|
1049
|
-
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);
|
|
1050
975
|
let renderValue = null;
|
|
1051
976
|
if (hasDefaultValue) {
|
|
1052
977
|
const { imports: argImports, render: value } = renderValueNode(
|
|
@@ -1072,18 +997,18 @@ function getRenderMapVisitor(options = {}) {
|
|
|
1072
997
|
const structVisitor = getTypeManifestVisitor({
|
|
1073
998
|
getImportFrom,
|
|
1074
999
|
getTraitsFromNode: getTraitsFromNode2,
|
|
1075
|
-
parentName: `${
|
|
1000
|
+
parentName: `${pascalCase(node.name)}InstructionData`
|
|
1076
1001
|
});
|
|
1077
|
-
const typeManifest =
|
|
1002
|
+
const typeManifest = visit(struct, structVisitor);
|
|
1078
1003
|
const dataTraits = getTraitsFromNode2(node);
|
|
1079
1004
|
imports.mergeWith(dataTraits.imports);
|
|
1080
|
-
return createRenderMap(`instructions/${
|
|
1005
|
+
return createRenderMap(`instructions/${snakeCase(node.name)}.rs`, {
|
|
1081
1006
|
content: render("instructionsPage.njk", {
|
|
1082
1007
|
dataTraits: dataTraits.render,
|
|
1083
1008
|
discriminatorConstants: discriminatorConstants.render,
|
|
1084
1009
|
hasArgs,
|
|
1085
1010
|
hasOptional,
|
|
1086
|
-
imports: imports.mergeWith(discriminatorConstants.imports).remove(`generatedInstructions::${
|
|
1011
|
+
imports: imports.mergeWith(discriminatorConstants.imports).remove(`generatedInstructions::${pascalCase(node.name)}`).toString(dependencyMap),
|
|
1087
1012
|
instruction: node,
|
|
1088
1013
|
instructionArgs,
|
|
1089
1014
|
program,
|
|
@@ -1094,14 +1019,14 @@ function getRenderMapVisitor(options = {}) {
|
|
|
1094
1019
|
visitProgram(node, { self }) {
|
|
1095
1020
|
program = node;
|
|
1096
1021
|
let renders = mergeRenderMaps([
|
|
1097
|
-
...node.accounts.map((account) =>
|
|
1098
|
-
...node.definedTypes.map((type) =>
|
|
1022
|
+
...node.accounts.map((account) => visit(account, self)),
|
|
1023
|
+
...node.definedTypes.map((type) => visit(type, self)),
|
|
1099
1024
|
...getAllInstructionsWithSubs(node, {
|
|
1100
1025
|
leavesOnly: !renderParentInstructions
|
|
1101
|
-
}).map((ix) =>
|
|
1026
|
+
}).map((ix) => visit(ix, self))
|
|
1102
1027
|
]);
|
|
1103
1028
|
if (node.errors.length > 0) {
|
|
1104
|
-
renders = addToRenderMap(renders, `errors/${
|
|
1029
|
+
renders = addToRenderMap(renders, `errors/${snakeCase(node.name)}.rs`, {
|
|
1105
1030
|
content: render("errorsPage.njk", {
|
|
1106
1031
|
errors: node.errors,
|
|
1107
1032
|
imports: new ImportMap().toString(dependencyMap),
|
|
@@ -1138,7 +1063,7 @@ function getRenderMapVisitor(options = {}) {
|
|
|
1138
1063
|
["shared.rs"]: accountsToExport.length > 0 ? { content: render("sharedPage.njk", ctx) } : void 0,
|
|
1139
1064
|
["types/mod.rs"]: definedTypesToExport.length > 0 ? { content: render("definedTypesMod.njk", ctx) } : void 0
|
|
1140
1065
|
}),
|
|
1141
|
-
...getAllPrograms(node).map((p) =>
|
|
1066
|
+
...getAllPrograms(node).map((p) => visit(p, self))
|
|
1142
1067
|
]);
|
|
1143
1068
|
}
|
|
1144
1069
|
}),
|
|
@@ -1154,18 +1079,12 @@ function getConflictsForInstructionAccountsAndArgs(instruction) {
|
|
|
1154
1079
|
const duplicates = allNames.filter((e, i, a) => a.indexOf(e) !== i);
|
|
1155
1080
|
return [...new Set(duplicates)];
|
|
1156
1081
|
}
|
|
1157
|
-
|
|
1158
|
-
// src/renderVisitor.ts
|
|
1159
|
-
import { logError, logWarn as logWarn2 } from "@codama/errors";
|
|
1160
|
-
import { deleteDirectory, writeRenderMapVisitor } from "@codama/renderers-core";
|
|
1161
|
-
import { rootNodeVisitor, visit as visit5 } from "@codama/visitors-core";
|
|
1162
|
-
import { spawnSync } from "child_process";
|
|
1163
1082
|
function renderVisitor(path, options = {}) {
|
|
1164
1083
|
return rootNodeVisitor((root) => {
|
|
1165
1084
|
if (options.deleteFolderBeforeRendering ?? true) {
|
|
1166
1085
|
deleteDirectory(path);
|
|
1167
1086
|
}
|
|
1168
|
-
|
|
1087
|
+
visit(root, writeRenderMapVisitor(getRenderMapVisitor(options), path));
|
|
1169
1088
|
if (options.formatCode) {
|
|
1170
1089
|
if (options.crateFolder) {
|
|
1171
1090
|
const removeFalsy = (arg) => Boolean(arg);
|
|
@@ -1176,7 +1095,7 @@ function renderVisitor(path, options = {}) {
|
|
|
1176
1095
|
)
|
|
1177
1096
|
);
|
|
1178
1097
|
} else {
|
|
1179
|
-
|
|
1098
|
+
logWarn("No crate folder specified, skipping formatting.");
|
|
1180
1099
|
}
|
|
1181
1100
|
}
|
|
1182
1101
|
});
|
|
@@ -1184,21 +1103,17 @@ function renderVisitor(path, options = {}) {
|
|
|
1184
1103
|
function runFormatter(cmd, args) {
|
|
1185
1104
|
const { stdout, stderr, error } = spawnSync(cmd, args);
|
|
1186
1105
|
if (error?.message?.includes("ENOENT")) {
|
|
1187
|
-
|
|
1106
|
+
logWarn(`Could not find ${cmd}, skipping formatting.`);
|
|
1188
1107
|
return;
|
|
1189
1108
|
}
|
|
1190
1109
|
if (stdout.length > 0) {
|
|
1191
|
-
|
|
1110
|
+
logWarn(`(cargo-fmt) ${stdout ? stdout?.toString() : error}`);
|
|
1192
1111
|
}
|
|
1193
1112
|
if (stderr.length > 0) {
|
|
1194
1113
|
logError(`(cargo-fmt) ${stderr ? stderr.toString() : error}`);
|
|
1195
1114
|
}
|
|
1196
1115
|
}
|
|
1197
|
-
|
|
1198
|
-
|
|
1199
|
-
|
|
1200
|
-
getRenderMapVisitor,
|
|
1201
|
-
getTypeManifestVisitor,
|
|
1202
|
-
renderVisitor
|
|
1203
|
-
};
|
|
1116
|
+
|
|
1117
|
+
export { ImportMap, renderVisitor as default, getRenderMapVisitor, getTypeManifestVisitor, renderVisitor };
|
|
1118
|
+
//# sourceMappingURL=index.node.mjs.map
|
|
1204
1119
|
//# sourceMappingURL=index.node.mjs.map
|