Skip to content

Commit

Permalink
Add support to prefix string type (#167)
Browse files Browse the repository at this point in the history
  • Loading branch information
febo committed Mar 3, 2024
1 parent 74d9f33 commit a631bc3
Show file tree
Hide file tree
Showing 3 changed files with 72 additions and 6 deletions.
5 changes: 5 additions & 0 deletions .changeset/lucky-numbers-glow.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@metaplex-foundation/kinobi': patch
---

Add support to prefix string type in Rust client
30 changes: 24 additions & 6 deletions src/renderers/rust/getTypeManifestVisitor.ts
Original file line number Diff line number Diff line change
Expand Up @@ -400,14 +400,32 @@ export function getTypeManifestVisitor() {
visitStringType(stringType) {
if (
isNode(stringType.size, 'prefixedSizeNode') &&
stringType.size.prefix.format === 'u32' &&
stringType.size.prefix.endian === 'le'
) {
return {
type: 'String',
imports: new RustImportMap(),
nestedStructs: [],
};
switch (stringType.size.prefix.format) {
case 'u32':
return {
type: 'String',
imports: new RustImportMap(),
nestedStructs: [],
};
case 'u8':
case 'u16':
case 'u64': {
const prefix = stringType.size.prefix.format.toUpperCase();
return {
type: `${prefix}PrefixString`,
imports: new RustImportMap().add(
`kaigan::types::${prefix}PrefixString`
),
nestedStructs: [],
};
}
default:
throw new Error(
`'String size not supported: ${stringType.size.prefix.format}`
);
}
}

if (isNode(stringType.size, 'fixedSizeNode')) {
Expand Down
43 changes: 43 additions & 0 deletions test/renderers/rust/definedTypesPage.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
import test from 'ava';
import {
definedTypeNode,
numberTypeNode,
prefixedSizeNode,
programNode,
stringTypeNode,
structFieldTypeNode,
structTypeNode,
visit,
} from '../../../src';
import { getRenderMapVisitor } from '../../../src/renderers/rust/getRenderMapVisitor';
import { codeContains } from './_setup';

test('it renders a prefix string on a defined type', (t) => {
// Given the following program with 1 defined type using a prefixed size string.
const node = programNode({
name: 'splToken',
publicKey: 'TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA',
definedTypes: [
definedTypeNode({
name: 'blob',
type: structTypeNode([
structFieldTypeNode({
name: 'contentType',
type: stringTypeNode({
size: prefixedSizeNode(numberTypeNode('u8')),
}),
}),
]),
}),
],
});

// When we render it.
const renderMap = visit(node, getRenderMapVisitor());

// Then we expect the following use and identifier to be rendered.
codeContains(t, renderMap.get('types/blob.rs'), [
`use kaigan::types::U8PrefixString;`,
`content_type: U8PrefixString,`,
]);
});

0 comments on commit a631bc3

Please sign in to comment.