@codama/renderers-rust 1.2.6 → 1.2.8
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 +111 -40
- package/dist/index.node.cjs.map +1 -1
- package/dist/index.node.mjs +111 -40
- package/dist/index.node.mjs.map +1 -1
- package/dist/templates/instructionsCpiPage.njk +2 -2
- package/dist/templates/instructionsPage.njk +16 -2
- package/dist/types/getRenderMapVisitor.d.ts +3 -1
- package/dist/types/getRenderMapVisitor.d.ts.map +1 -1
- package/dist/types/getTypeManifestVisitor.d.ts +2 -1
- package/dist/types/getTypeManifestVisitor.d.ts.map +1 -1
- package/dist/types/renderVisitor.d.ts.map +1 -1
- package/dist/types/utils/render.d.ts.map +1 -1
- package/dist/types/utils/traitOptions.d.ts +5 -0
- package/dist/types/utils/traitOptions.d.ts.map +1 -1
- package/package.json +10 -10
package/dist/index.node.cjs
CHANGED
|
@@ -386,6 +386,10 @@ var render = (template, context, options) => {
|
|
|
386
386
|
env.addFilter("kebabCase", import_nodes3.kebabCase);
|
|
387
387
|
env.addFilter("titleCase", import_nodes3.titleCase);
|
|
388
388
|
env.addFilter("rustDocblock", rustDocblock);
|
|
389
|
+
env.addFilter("hasTrait", (traits, ...traitNames) => {
|
|
390
|
+
if (typeof traits !== "string") return false;
|
|
391
|
+
return traitNames.some((traitName) => traits.includes(traitName));
|
|
392
|
+
});
|
|
389
393
|
return env.render(template, context);
|
|
390
394
|
};
|
|
391
395
|
|
|
@@ -490,14 +494,51 @@ function extractFullyQualifiedNames(traits, imports) {
|
|
|
490
494
|
return trait.slice(index + 2);
|
|
491
495
|
});
|
|
492
496
|
}
|
|
497
|
+
function getSerdeFieldAttribute(serdeWith, node, userOptions = {}) {
|
|
498
|
+
(0, import_nodes4.assertIsNode)(node, ["accountNode", "definedTypeNode", "instructionNode"]);
|
|
499
|
+
const options = { ...DEFAULT_TRAIT_OPTIONS, ...userOptions };
|
|
500
|
+
const nodeType = getNodeType(node);
|
|
501
|
+
if (nodeType === "alias") {
|
|
502
|
+
return "";
|
|
503
|
+
}
|
|
504
|
+
const sanitizedOverrides = Object.fromEntries(
|
|
505
|
+
Object.entries(options.overrides).map(([key, value]) => [(0, import_nodes4.camelCase)(key), value])
|
|
506
|
+
);
|
|
507
|
+
const nodeOverrides = sanitizedOverrides[node.name];
|
|
508
|
+
const allTraits = nodeOverrides === void 0 ? getDefaultTraits(nodeType, options) : nodeOverrides;
|
|
509
|
+
const hasSerdeSerialize = allTraits.some((t) => t === "serde::Serialize" || t === "Serialize");
|
|
510
|
+
const hasSerdeDeserialize = allTraits.some((t) => t === "serde::Deserialize" || t === "Deserialize");
|
|
511
|
+
if (!hasSerdeSerialize && !hasSerdeDeserialize) {
|
|
512
|
+
return "";
|
|
513
|
+
}
|
|
514
|
+
const partitionedTraits = partitionTraitsInFeatures(allTraits, options.featureFlags);
|
|
515
|
+
const featuredTraits = partitionedTraits[1];
|
|
516
|
+
let serdeFeatureName;
|
|
517
|
+
for (const [feature, traits] of Object.entries(featuredTraits)) {
|
|
518
|
+
if (traits.some(
|
|
519
|
+
(t) => t === "serde::Serialize" || t === "serde::Deserialize" || t === "Serialize" || t === "Deserialize"
|
|
520
|
+
)) {
|
|
521
|
+
serdeFeatureName = feature;
|
|
522
|
+
break;
|
|
523
|
+
}
|
|
524
|
+
}
|
|
525
|
+
if (serdeFeatureName) {
|
|
526
|
+
return `#[cfg_attr(feature = "${serdeFeatureName}", serde(with = "${serdeWith}"))]
|
|
527
|
+
`;
|
|
528
|
+
} else {
|
|
529
|
+
return `#[serde(with = "${serdeWith}")]
|
|
530
|
+
`;
|
|
531
|
+
}
|
|
532
|
+
}
|
|
493
533
|
|
|
494
534
|
// src/getTypeManifestVisitor.ts
|
|
495
535
|
function getTypeManifestVisitor(options) {
|
|
496
|
-
const { getImportFrom, getTraitsFromNode: getTraitsFromNode2 } = options;
|
|
536
|
+
const { getImportFrom, getTraitsFromNode: getTraitsFromNode2, traitOptions } = options;
|
|
497
537
|
let parentName = options.parentName ?? null;
|
|
498
538
|
let nestedStruct = options.nestedStruct ?? false;
|
|
499
539
|
let inlineStruct = false;
|
|
500
540
|
let parentSize = null;
|
|
541
|
+
let parentNode = null;
|
|
501
542
|
return (0, import_visitors_core3.pipe)(
|
|
502
543
|
(0, import_visitors_core3.mergeVisitor)(
|
|
503
544
|
() => ({ imports: new ImportMap(), nestedStructs: [], type: "" }),
|
|
@@ -510,10 +551,12 @@ function getTypeManifestVisitor(options) {
|
|
|
510
551
|
(v) => (0, import_visitors_core3.extendVisitor)(v, {
|
|
511
552
|
visitAccount(account, { self }) {
|
|
512
553
|
parentName = (0, import_nodes5.pascalCase)(account.name);
|
|
554
|
+
parentNode = account;
|
|
513
555
|
const manifest = (0, import_visitors_core3.visit)(account.data, self);
|
|
514
556
|
const traits = getTraitsFromNode2(account);
|
|
515
557
|
manifest.imports.mergeWith(traits.imports);
|
|
516
558
|
parentName = null;
|
|
559
|
+
parentNode = null;
|
|
517
560
|
return {
|
|
518
561
|
...manifest,
|
|
519
562
|
type: traits.render + manifest.type
|
|
@@ -588,10 +631,12 @@ function getTypeManifestVisitor(options) {
|
|
|
588
631
|
},
|
|
589
632
|
visitDefinedType(definedType, { self }) {
|
|
590
633
|
parentName = (0, import_nodes5.pascalCase)(definedType.name);
|
|
634
|
+
parentNode = definedType;
|
|
591
635
|
const manifest = (0, import_visitors_core3.visit)(definedType.type, self);
|
|
592
636
|
const traits = getTraitsFromNode2(definedType);
|
|
593
637
|
manifest.imports.mergeWith(traits.imports);
|
|
594
638
|
parentName = null;
|
|
639
|
+
parentNode = null;
|
|
595
640
|
const renderedType = (0, import_nodes5.isNode)(definedType.type, ["enumTypeNode", "structTypeNode"]) ? manifest.type : `pub type ${(0, import_nodes5.pascalCase)(definedType.name)} = ${manifest.type};`;
|
|
596
641
|
return { ...manifest, type: `${traits.render}${renderedType}` };
|
|
597
642
|
},
|
|
@@ -638,10 +683,18 @@ function getTypeManifestVisitor(options) {
|
|
|
638
683
|
const childManifest = (0, import_visitors_core3.visit)(enumTupleVariantType.tuple, self);
|
|
639
684
|
parentName = originalParentName;
|
|
640
685
|
let derive = "";
|
|
641
|
-
if (childManifest.type === "(Pubkey)") {
|
|
642
|
-
derive =
|
|
643
|
-
|
|
644
|
-
|
|
686
|
+
if (parentNode && childManifest.type === "(Pubkey)") {
|
|
687
|
+
derive = getSerdeFieldAttribute(
|
|
688
|
+
"serde_with::As::<serde_with::DisplayFromStr>",
|
|
689
|
+
parentNode,
|
|
690
|
+
traitOptions
|
|
691
|
+
);
|
|
692
|
+
} else if (parentNode && childManifest.type === "(Vec<Pubkey>)") {
|
|
693
|
+
derive = getSerdeFieldAttribute(
|
|
694
|
+
"serde_with::As::<Vec<serde_with::DisplayFromStr>>",
|
|
695
|
+
parentNode,
|
|
696
|
+
traitOptions
|
|
697
|
+
);
|
|
645
698
|
}
|
|
646
699
|
return {
|
|
647
700
|
...childManifest,
|
|
@@ -788,14 +841,28 @@ ${variantNames}
|
|
|
788
841
|
const docblock = rustDocblock((0, import_nodes5.parseDocs)(structFieldType.docs));
|
|
789
842
|
const resolvedNestedType = (0, import_nodes5.resolveNestedTypeNode)(structFieldType.type);
|
|
790
843
|
let derive = "";
|
|
791
|
-
if (
|
|
792
|
-
|
|
793
|
-
|
|
794
|
-
|
|
795
|
-
|
|
796
|
-
|
|
797
|
-
|
|
798
|
-
|
|
844
|
+
if (parentNode) {
|
|
845
|
+
if (fieldManifest.type === "Pubkey") {
|
|
846
|
+
derive = getSerdeFieldAttribute(
|
|
847
|
+
"serde_with::As::<serde_with::DisplayFromStr>",
|
|
848
|
+
parentNode,
|
|
849
|
+
traitOptions
|
|
850
|
+
);
|
|
851
|
+
} else if (fieldManifest.type === "Vec<Pubkey>") {
|
|
852
|
+
derive = getSerdeFieldAttribute(
|
|
853
|
+
"serde_with::As::<Vec<serde_with::DisplayFromStr>>",
|
|
854
|
+
parentNode,
|
|
855
|
+
traitOptions
|
|
856
|
+
);
|
|
857
|
+
} else if ((0, import_nodes5.isNode)(resolvedNestedType, "arrayTypeNode") && (0, import_nodes5.isNode)(resolvedNestedType.count, "fixedCountNode") && resolvedNestedType.count.value > 32) {
|
|
858
|
+
derive = getSerdeFieldAttribute("serde_big_array::BigArray", parentNode, traitOptions);
|
|
859
|
+
} else if ((0, import_nodes5.isNode)(resolvedNestedType, ["bytesTypeNode", "stringTypeNode"]) && (0, import_nodes5.isNode)(structFieldType.type, "fixedSizeTypeNode") && structFieldType.type.size > 32) {
|
|
860
|
+
derive = getSerdeFieldAttribute(
|
|
861
|
+
"serde_with::As::<serde_with::Bytes>",
|
|
862
|
+
parentNode,
|
|
863
|
+
traitOptions
|
|
864
|
+
);
|
|
865
|
+
}
|
|
799
866
|
}
|
|
800
867
|
return {
|
|
801
868
|
...fieldManifest,
|
|
@@ -868,7 +935,11 @@ function getRenderMapVisitor(options = {}) {
|
|
|
868
935
|
const dependencyMap = options.dependencyMap ?? {};
|
|
869
936
|
const getImportFrom = getImportFromFactory(options.linkOverrides ?? {});
|
|
870
937
|
const getTraitsFromNode2 = getTraitsFromNodeFactory(options.traitOptions);
|
|
871
|
-
const typeManifestVisitor = getTypeManifestVisitor({
|
|
938
|
+
const typeManifestVisitor = getTypeManifestVisitor({
|
|
939
|
+
getImportFrom,
|
|
940
|
+
getTraitsFromNode: getTraitsFromNode2,
|
|
941
|
+
traitOptions: options.traitOptions
|
|
942
|
+
});
|
|
872
943
|
const anchorTraits = options.anchorTraits ?? true;
|
|
873
944
|
return (0, import_visitors_core4.pipe)(
|
|
874
945
|
(0, import_visitors_core4.staticVisitor)(() => (0, import_renderers_core.createRenderMap)(), {
|
|
@@ -910,9 +981,8 @@ function getRenderMapVisitor(options = {}) {
|
|
|
910
981
|
if (hasVariableSeeds) {
|
|
911
982
|
imports.mergeWith(seedsImports);
|
|
912
983
|
}
|
|
913
|
-
return (0, import_renderers_core.createRenderMap)(
|
|
914
|
-
|
|
915
|
-
render("accountsPage.njk", {
|
|
984
|
+
return (0, import_renderers_core.createRenderMap)(`accounts/${(0, import_nodes6.snakeCase)(node.name)}.rs`, {
|
|
985
|
+
content: render("accountsPage.njk", {
|
|
916
986
|
account: node,
|
|
917
987
|
anchorTraits,
|
|
918
988
|
constantSeeds,
|
|
@@ -924,19 +994,18 @@ function getRenderMapVisitor(options = {}) {
|
|
|
924
994
|
seeds,
|
|
925
995
|
typeManifest
|
|
926
996
|
})
|
|
927
|
-
);
|
|
997
|
+
});
|
|
928
998
|
},
|
|
929
999
|
visitDefinedType(node) {
|
|
930
1000
|
const typeManifest = (0, import_visitors_core4.visit)(node, typeManifestVisitor);
|
|
931
1001
|
const imports = new ImportMap().mergeWithManifest(typeManifest);
|
|
932
|
-
return (0, import_renderers_core.createRenderMap)(
|
|
933
|
-
|
|
934
|
-
render("definedTypesPage.njk", {
|
|
1002
|
+
return (0, import_renderers_core.createRenderMap)(`types/${(0, import_nodes6.snakeCase)(node.name)}.rs`, {
|
|
1003
|
+
content: render("definedTypesPage.njk", {
|
|
935
1004
|
definedType: node,
|
|
936
1005
|
imports: imports.remove(`generatedTypes::${(0, import_nodes6.pascalCase)(node.name)}`).toString(dependencyMap),
|
|
937
1006
|
typeManifest
|
|
938
1007
|
})
|
|
939
|
-
);
|
|
1008
|
+
});
|
|
940
1009
|
},
|
|
941
1010
|
visitInstruction(node) {
|
|
942
1011
|
const imports = new ImportMap();
|
|
@@ -997,9 +1066,8 @@ function getRenderMapVisitor(options = {}) {
|
|
|
997
1066
|
const typeManifest = (0, import_visitors_core4.visit)(struct, structVisitor);
|
|
998
1067
|
const dataTraits = getTraitsFromNode2(node);
|
|
999
1068
|
imports.mergeWith(dataTraits.imports);
|
|
1000
|
-
return (0, import_renderers_core.createRenderMap)(
|
|
1001
|
-
|
|
1002
|
-
render("instructionsPage.njk", {
|
|
1069
|
+
return (0, import_renderers_core.createRenderMap)(`instructions/${(0, import_nodes6.snakeCase)(node.name)}.rs`, {
|
|
1070
|
+
content: render("instructionsPage.njk", {
|
|
1003
1071
|
dataTraits: dataTraits.render,
|
|
1004
1072
|
discriminatorConstants: discriminatorConstants.render,
|
|
1005
1073
|
hasArgs,
|
|
@@ -1010,7 +1078,7 @@ function getRenderMapVisitor(options = {}) {
|
|
|
1010
1078
|
program,
|
|
1011
1079
|
typeManifest
|
|
1012
1080
|
})
|
|
1013
|
-
);
|
|
1081
|
+
});
|
|
1014
1082
|
},
|
|
1015
1083
|
visitProgram(node, { self }) {
|
|
1016
1084
|
program = node;
|
|
@@ -1022,15 +1090,13 @@ function getRenderMapVisitor(options = {}) {
|
|
|
1022
1090
|
}).map((ix) => (0, import_visitors_core4.visit)(ix, self))
|
|
1023
1091
|
]);
|
|
1024
1092
|
if (node.errors.length > 0) {
|
|
1025
|
-
renders = (0, import_renderers_core.addToRenderMap)(
|
|
1026
|
-
|
|
1027
|
-
`errors/${(0, import_nodes6.snakeCase)(node.name)}.rs`,
|
|
1028
|
-
render("errorsPage.njk", {
|
|
1093
|
+
renders = (0, import_renderers_core.addToRenderMap)(renders, `errors/${(0, import_nodes6.snakeCase)(node.name)}.rs`, {
|
|
1094
|
+
content: render("errorsPage.njk", {
|
|
1029
1095
|
errors: node.errors,
|
|
1030
1096
|
imports: new ImportMap().toString(dependencyMap),
|
|
1031
1097
|
program: node
|
|
1032
1098
|
})
|
|
1033
|
-
);
|
|
1099
|
+
});
|
|
1034
1100
|
}
|
|
1035
1101
|
program = null;
|
|
1036
1102
|
return renders;
|
|
@@ -1053,13 +1119,13 @@ function getRenderMapVisitor(options = {}) {
|
|
|
1053
1119
|
};
|
|
1054
1120
|
return (0, import_renderers_core.mergeRenderMaps)([
|
|
1055
1121
|
(0, import_renderers_core.createRenderMap)({
|
|
1056
|
-
["accounts/mod.rs"]: accountsToExport.length > 0 ? render("accountsMod.njk", ctx) : void 0,
|
|
1057
|
-
["errors/mod.rs"]: programsToExport.length > 0 ? render("errorsMod.njk", ctx) : void 0,
|
|
1058
|
-
["instructions/mod.rs"]: instructionsToExport.length > 0 ? render("instructionsMod.njk", ctx) : void 0,
|
|
1059
|
-
["mod.rs"]: render("rootMod.njk", ctx),
|
|
1060
|
-
["programs.rs"]: programsToExport.length > 0 ? render("programsMod.njk", ctx) : void 0,
|
|
1061
|
-
["shared.rs"]: accountsToExport.length > 0 ? render("sharedPage.njk", ctx) : void 0,
|
|
1062
|
-
["types/mod.rs"]: definedTypesToExport.length > 0 ? render("definedTypesMod.njk", ctx) : void 0
|
|
1122
|
+
["accounts/mod.rs"]: accountsToExport.length > 0 ? { content: render("accountsMod.njk", ctx) } : void 0,
|
|
1123
|
+
["errors/mod.rs"]: programsToExport.length > 0 ? { content: render("errorsMod.njk", ctx) } : void 0,
|
|
1124
|
+
["instructions/mod.rs"]: instructionsToExport.length > 0 ? { content: render("instructionsMod.njk", ctx) } : void 0,
|
|
1125
|
+
["mod.rs"]: { content: render("rootMod.njk", ctx) },
|
|
1126
|
+
["programs.rs"]: programsToExport.length > 0 ? { content: render("programsMod.njk", ctx) } : void 0,
|
|
1127
|
+
["shared.rs"]: accountsToExport.length > 0 ? { content: render("sharedPage.njk", ctx) } : void 0,
|
|
1128
|
+
["types/mod.rs"]: definedTypesToExport.length > 0 ? { content: render("definedTypesMod.njk", ctx) } : void 0
|
|
1063
1129
|
}),
|
|
1064
1130
|
...(0, import_nodes6.getAllPrograms)(node).map((p) => (0, import_visitors_core4.visit)(p, self))
|
|
1065
1131
|
]);
|
|
@@ -1091,8 +1157,13 @@ function renderVisitor(path, options = {}) {
|
|
|
1091
1157
|
(0, import_visitors_core5.visit)(root, (0, import_renderers_core2.writeRenderMapVisitor)(getRenderMapVisitor(options), path));
|
|
1092
1158
|
if (options.formatCode) {
|
|
1093
1159
|
if (options.crateFolder) {
|
|
1094
|
-
const
|
|
1095
|
-
runFormatter(
|
|
1160
|
+
const removeFalsy = (arg) => Boolean(arg);
|
|
1161
|
+
runFormatter(
|
|
1162
|
+
"cargo",
|
|
1163
|
+
[options.toolchain, "fmt", "--manifest-path", `${options.crateFolder}/Cargo.toml`].filter(
|
|
1164
|
+
removeFalsy
|
|
1165
|
+
)
|
|
1166
|
+
);
|
|
1096
1167
|
} else {
|
|
1097
1168
|
(0, import_errors4.logWarn)("No crate folder specified, skipping formatting.");
|
|
1098
1169
|
}
|