Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions clients/js/src/generated/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,3 +9,4 @@
export * from './accounts';
export * from './instructions';
export * from './programs';
export * from './types';
53 changes: 53 additions & 0 deletions clients/js/src/generated/types/configKeys.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
/**
* This code was AUTOGENERATED using the codama library.
* Please DO NOT EDIT THIS FILE, instead use visitors
* to add features, then rerun codama to update it.
*
* @see https://github.com/codama-idl/codama
*/

import {
combineCodec,
getAddressDecoder,
getAddressEncoder,
getArrayDecoder,
getArrayEncoder,
getBooleanDecoder,
getBooleanEncoder,
getShortU16Decoder,
getShortU16Encoder,
getTupleDecoder,
getTupleEncoder,
type Address,
type Codec,
type Decoder,
type Encoder,
} from '@solana/web3.js';

/**
* A collection of keys to be stored in Config account data.
* Each key tuple comprises a unique `Pubkey` identifier,
* and `bool` whether that key is a signer of the data.
*/

export type ConfigKeys = Array<readonly [Address, boolean]>;

export type ConfigKeysArgs = ConfigKeys;

export function getConfigKeysEncoder(): Encoder<ConfigKeysArgs> {
return getArrayEncoder(
getTupleEncoder([getAddressEncoder(), getBooleanEncoder()]),
{ size: getShortU16Encoder() }
);
}

export function getConfigKeysDecoder(): Decoder<ConfigKeys> {
return getArrayDecoder(
getTupleDecoder([getAddressDecoder(), getBooleanDecoder()]),
{ size: getShortU16Decoder() }
);
}

export function getConfigKeysCodec(): Codec<ConfigKeysArgs, ConfigKeys> {
return combineCodec(getConfigKeysEncoder(), getConfigKeysDecoder());
}
9 changes: 9 additions & 0 deletions clients/js/src/generated/types/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
/**
* This code was AUTOGENERATED using the codama library.
* Please DO NOT EDIT THIS FILE, instead use visitors
* to add features, then rerun codama to update it.
*
* @see https://github.com/codama-idl/codama
*/

export * from './configKeys';
2 changes: 1 addition & 1 deletion clients/rust/src/generated/accounts/config.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
//! <https://github.com/codama-idl/codama>

use {
crate::generated::types::ConfigKeys,
crate::hooked::ConfigKeys,
borsh::{BorshDeserialize, BorshSerialize},
kaigan::types::RemainderVec,
};
Expand Down
2 changes: 1 addition & 1 deletion clients/rust/src/generated/instructions/store.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
//! <https://github.com/codama-idl/codama>

use {
crate::generated::types::ConfigKeys,
crate::hooked::ConfigKeys,
borsh::{BorshDeserialize, BorshSerialize},
kaigan::types::RemainderVec,
};
Expand Down
95 changes: 43 additions & 52 deletions program/idl.json
Original file line number Diff line number Diff line change
Expand Up @@ -13,31 +13,8 @@
"kind": "structFieldTypeNode",
"name": "keys",
"type": {
"kind": "arrayTypeNode",
"item": {
"kind": "tupleTypeNode",
"items": [
{
"kind": "publicKeyTypeNode"
},
{
"kind": "booleanTypeNode",
"size": {
"kind": "numberTypeNode",
"format": "u8",
"endian": "le"
}
}
]
},
"count": {
"kind": "prefixedCountNode",
"prefix": {
"kind": "numberTypeNode",
"format": "shortU16",
"endian": "le"
}
}
"kind": "definedTypeLinkNode",
"name": "configKeys"
},
"docs": [
"List of pubkeys stored in the config account,",
Expand Down Expand Up @@ -80,31 +57,8 @@
"kind": "instructionArgumentNode",
"name": "keys",
"type": {
"kind": "arrayTypeNode",
"item": {
"kind": "tupleTypeNode",
"items": [
{
"kind": "publicKeyTypeNode"
},
{
"kind": "booleanTypeNode",
"size": {
"kind": "numberTypeNode",
"format": "u8",
"endian": "le"
}
}
]
},
"count": {
"kind": "prefixedCountNode",
"prefix": {
"kind": "numberTypeNode",
"format": "shortU16",
"endian": "le"
}
}
"kind": "definedTypeLinkNode",
"name": "configKeys"
},
"docs": [
"List of pubkeys to store in the config account,",
Expand Down Expand Up @@ -141,9 +95,46 @@
"optionalAccountStrategy": "omitted"
}
],
"definedTypes": [],
"definedTypes": [
{
"kind": "definedTypeNode",
"name": "configKeys",
Comment on lines +98 to +101
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nice. I like how this is an IDL-defined type now, instead of in-lined.

"type": {
"kind": "arrayTypeNode",
"item": {
"kind": "tupleTypeNode",
"items": [
{
"kind": "publicKeyTypeNode"
},
{
"kind": "booleanTypeNode",
"size": {
"kind": "numberTypeNode",
"format": "u8",
"endian": "le"
}
}
]
},
"count": {
"kind": "prefixedCountNode",
"prefix": {
"kind": "numberTypeNode",
"format": "shortU16",
"endian": "le"
}
}
},
"docs": [
"A collection of keys to be stored in Config account data.",
"Each key tuple comprises a unique `Pubkey` identifier,",
"and `bool` whether that key is a signer of the data."
]
}
],
"errors": [],
"name": "solanaConfigProgram",
"name": "solanaConfig",
"prefix": "",
"publicKey": "Config1111111111111111111111111111111111111",
"version": "0.0.1",
Expand Down
42 changes: 10 additions & 32 deletions scripts/generate-clients.mjs
Original file line number Diff line number Diff line change
@@ -1,45 +1,15 @@
#!/usr/bin/env zx
import 'zx/globals';
import * as c from 'codama';
import { createFromRoot, deleteNodesVisitor } from 'codama';
import { renderVisitor as renderJavaScriptVisitor } from '@codama/renderers-js';
import { renderVisitor as renderRustVisitor } from '@codama/renderers-rust';
import { getToolchainArgument, workingDirectory } from './utils.mjs';

// Instanciate Codama.
const codama = c.createFromRoot(
const codama = createFromRoot(
require(path.join(workingDirectory, 'program', 'idl.json'))
);

// Update programs.
codama.update(
c.updateProgramsVisitor({
solanaConfigProgram: { name: 'solanaConfig' },
})
);

// Add missing types from the IDL.
codama.update(
c.bottomUpTransformerVisitor([
{
select: (node) => {
const names = ['keys'];
return (
names.includes(node.name) &&
(c.isNode(node, 'instructionArgumentNode') ||
c.isNode(node, 'structFieldTypeNode')) &&
c.isNode(node.type, 'arrayTypeNode')
);
},
transform: (node) => {
return {
...node,
type: c.definedTypeLinkNode('configKeys'),
};
},
},
])
);

// Render JavaScript.
const jsClient = path.join(__dirname, '..', 'clients', 'js');
codama.accept(
Expand All @@ -48,12 +18,20 @@ codama.accept(
})
);

// FIXME(loris): Temporary fix until the Rust renderer fixes the missing semicolon.
codama.update(deleteNodesVisitor(['[definedTypeNode]configKeys']));

// Render Rust.
const rustClient = path.join(__dirname, '..', 'clients', 'rust');
codama.accept(
renderRustVisitor(path.join(rustClient, 'src', 'generated'), {
formatCode: true,
crateFolder: rustClient,
toolchain: getToolchainArgument('format'),

// FIXME(loris): Temporary fix until the Rust renderer fixes the missing semicolon.
linkOverrides: {
definedTypes: { configKeys: 'hooked' },
},
})
);
Loading