@swaptoshi/utils
Version:
Library containing generic utility functions for use with Swaptoshi-related software
58 lines (57 loc) • 1.61 kB
TypeScript
export type TypedSchema<T> = {
$id: string;
} & ObjectSchema<T>;
type ObjectSchema<T> = {
type: 'object';
required: (keyof T extends string ? keyof T : never)[];
properties: SchemaProperties<T>;
};
type SchemaProperties<T> = {
[K in keyof T]: K extends keyof T ? TypeScriptTypeToSchemaType<T[K]> & SchemaPropertiesFields : never;
};
export type SchemaPropertiesFields = {
fieldNumber: number;
format?: 'hex' | 'klayr32';
minLength?: number;
maxLength?: number;
minimum?: number;
maximum?: number;
};
export type TypeScriptTypeToSchemaType<T> = T extends string ? {
dataType: 'string';
} : T extends boolean ? {
dataType: 'boolean';
} : T extends Buffer ? {
dataType: 'bytes';
} : T extends number ? {
dataType: 'uint32';
} | {
dataType: 'sint32';
} : T extends bigint ? {
dataType: 'uint64';
} | {
dataType: 'sint64';
} : T extends unknown[] ? ArraySchema<T> : T extends object ? ObjectSchema<T> : unknown;
type ArraySchema<T> = {
type: 'array';
items: ArraySchemaItems<T>;
};
type ArraySchemaItems<T> = TypescriptArrayToSchemaType<T> & {
format?: 'hex' | 'klayr32';
};
type TypescriptArrayToSchemaType<T> = T extends string[] ? {
dataType: 'string';
} : T extends boolean[] ? {
dataType: 'boolean';
} : T extends Buffer[] ? {
dataType: 'bytes';
} : T extends number[] ? {
dataType: 'uint32';
} | {
dataType: 'sint32';
} : T extends bigint[] ? {
dataType: 'uint64';
} | {
dataType: 'sint64';
} : T extends unknown[][] ? ArraySchema<T[0]> : T extends object[] ? ObjectSchema<T[0]> : unknown;
export {};