Jelajahi Sumber

Add support for ShortU16 and ShortVec on Rust renderer (#144)

Loris Leiva 1 tahun lalu
induk
melakukan
dc04203f42

+ 5 - 0
.changeset/happy-apples-design.md

@@ -0,0 +1,5 @@
+---
+"@kinobi-so/renderers-rust": patch
+---
+
+Add support for ShortU16 and ShortVec

+ 18 - 7
packages/renderers-rust/src/getTypeManifestVisitor.ts

@@ -92,6 +92,13 @@ export function getTypeManifestVisitor(options: { nestedStruct?: boolean; parent
                                     type: `${prefixFormat}PrefixVec<${childManifest.type}>`,
                                 };
                             }
+                            case 'shortU16': {
+                                childManifest.imports.add('solana_program::short_vec::ShortVec');
+                                return {
+                                    ...childManifest,
+                                    type: `ShortVec<${childManifest.type}>`,
+                                };
+                            }
                             default:
                                 throw new Error(`Array prefix not supported: ${prefix.format}`);
                         }
@@ -253,20 +260,24 @@ export function getTypeManifestVisitor(options: { nestedStruct?: boolean; parent
                 },
 
                 visitNumberType(numberType) {
-                    if (numberType.format === 'shortU16') {
-                        throw new Error('shortU16 numbers are not supported by the Rust renderer');
+                    if (numberType.endian !== 'le') {
+                        // TODO: Add to the Rust validator.
+                        throw new Error('Number endianness not supported by Borsh');
                     }
 
-                    if (numberType.endian === 'le') {
+                    if (numberType.format === 'shortU16') {
                         return {
-                            imports: new ImportMap(),
+                            imports: new ImportMap().add('solana_program::short_vec::ShortU16'),
                             nestedStructs: [],
-                            type: numberType.format,
+                            type: 'ShortU16',
                         };
                     }
 
-                    // TODO: Add to the Rust validator.
-                    throw new Error('Number endianness not supported by Borsh');
+                    return {
+                        imports: new ImportMap(),
+                        nestedStructs: [],
+                        type: numberType.format,
+                    };
                 },
 
                 visitOptionType(optionType, { self }) {

+ 37 - 0
packages/renderers-rust/test/types/array.test.ts

@@ -0,0 +1,37 @@
+import {
+    arrayTypeNode,
+    definedTypeNode,
+    numberTypeNode,
+    prefixedCountNode,
+    publicKeyTypeNode,
+    structFieldTypeNode,
+    structTypeNode,
+} from '@kinobi-so/nodes';
+import { visit } from '@kinobi-so/visitors-core';
+import { test } from 'vitest';
+
+import { getRenderMapVisitor } from '../../src';
+import { codeContains } from '../_setup';
+
+test('it exports short vecs', () => {
+    // Given an array using a shortU16 prefix.
+    const node = definedTypeNode({
+        name: 'myShortVec',
+        type: structTypeNode([
+            structFieldTypeNode({
+                name: 'value',
+                type: arrayTypeNode(publicKeyTypeNode(), prefixedCountNode(numberTypeNode('shortU16'))),
+            }),
+        ]),
+    });
+
+    // When we render the array.
+    const renderMap = visit(node, getRenderMapVisitor());
+
+    // Then we expect a short vec to be exported.
+    codeContains(renderMap.get('types/my_short_vec.rs'), [
+        /pub value: ShortVec<Pubkey>/,
+        /use solana_program::pubkey::Pubkey/,
+        /use solana_program::short_vec::ShortVec/,
+    ]);
+});

+ 23 - 0
packages/renderers-rust/test/types/number.test.ts

@@ -0,0 +1,23 @@
+import { definedTypeNode, numberTypeNode, structFieldTypeNode, structTypeNode } from '@kinobi-so/nodes';
+import { visit } from '@kinobi-so/visitors-core';
+import { test } from 'vitest';
+
+import { getRenderMapVisitor } from '../../src';
+import { codeContains } from '../_setup';
+
+test('it exports short u16 numbers', () => {
+    // Given a shortU16 number.
+    const node = definedTypeNode({
+        name: 'myShortU16',
+        type: structTypeNode([structFieldTypeNode({ name: 'value', type: numberTypeNode('shortU16') })]),
+    });
+
+    // When we render the number.
+    const renderMap = visit(node, getRenderMapVisitor());
+
+    // Then we expect a short u16 to be exported.
+    codeContains(renderMap.get('types/my_short_u16.rs'), [
+        /pub value: ShortU16/,
+        /use solana_program::short_vec::ShortU16/,
+    ]);
+});