2个版本
0.0.2 | 2022年1月10日 |
---|---|
0.0.1 | 2022年1月10日 |
#19 in #borsh
57KB
1.5K SLoC
描述
一个解析库,可以从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