#borsh #serialization #solana #web3

agsol-borsh-schema

生成Borsh序列化TypeScript代码的解析器

2个版本

0.0.2 2022年1月10日
0.0.1 2022年1月10日

#19 in #borsh


用于 3 个crate(2个直接使用)

MIT 许可证

57KB
1.5K SLoC

Rust 808 SLoC TypeScript 516 SLoC // 0.0% comments

描述

一个解析库,可以从Rust数据结构生成TypeScript类和序列化模式

用法

在Rust struct 前添加 BorshSchema 可推导特性,如下所示

#[derive(BorshSchema)]
struct SomeStruct {
	foo: u32,
	bar: Option<u64>,
	baz: Vec<String>,
	quux: BTreeMap<[u8; 32], Pubkey>,
}

解析器将生成以下TypeScript输出

export class SomeStruct extends Struct {
	foo: number,
	bar: BN | null,
	baz: string[],
	quux: Map<[32], PublicKey>,
}

export const SCHEMA = new Map<any, any>([
	[
		SomeStruct,
		{
			kind: 'struct', fields [
				['foo', 'u32'],
				['bar', { kind: 'option', type: 'u64' }],
				['baz', ['string']],
				['quux', { kind: 'map', key: [32], value: 'publicKey' }],
			],
		},
	],
])

该库还支持 enum 类型,只需添加 BorshSchema 可推导属性。

例如

#[derive(BorshSchema)]
struct FooStruct {
	foo: Option<String>,
}
#[derive(BorshSchema)]
enum SomeEnum {
	UnitVariant,
	UnnamedFields(u64, [String; 2]),
	NamedFields {
		foo_struct: FooStruct,
		bar: Vec<u8>,
	},
}

将生成

export class FooStruct extends Struct {
	foo: string | null,
}

export class SomeEnum extends Enum {
	someEnumUnitVariant: someEnumUnitVariant,
	someEnumUnnamedFields: someEnumUnnamedFields, 
	someEnumNamedFields: someEnumNamedFields, 
}

export class SomeEnumUnitVariant extends Struct {}
export class SomeEnumUnnamedFields extends Struct {
	unnamed_1: BN,
	unnamed_2: string[],
}

export class SomeEnumNamedFields extends Struct {
	fooStruct: FooStruct,
	bar: number[],
}

export const SCHEMA = new Map<any, any>([
	[
		FooStruct,
		{
			kind: 'struct', fields [
				[foo: { kind: 'option', type: 'u64' }],
			],
		},
	],
	[
		SomeEnum,
		{
			kind: 'enum', field: 'enum', values: [
				['someEnumUnitVariant', SomeEnumUnitVariant],
				['someEnumUnnamedFields', SomeEnumUnnamedFields],
				['someEnumNamedFields', SomeEnumNnamedFields],
			],
		},
	],
	[
		SomeEnumUnitVariant,
		{
			kind: `struct`, fields [],
		},
	],
	[
		SomeEnumUnnamedFields,
		{
			kind: `struct`, fields [
				['unnamed_1', u64],
				['unnamed_2', ['string', 2]],
			],
		},
	],
	[
		SomeEnumNamedFields,
		{
			kind: `struct`, fields [
				['fooStruct', FooStruct],
				['bar', ['u8']],
			],
		},
	],
])

依赖项

~1.1–1.6MB
~37K SLoC