export type Pointer = number | bigint; export type PrimitiveType = "u8" | "u16" | "u32" | "u64" | "f32" | "f64" | "pointer" | "i32" | "i16" | "i64" | "bool_u8" | "bool_u32"; export interface PointyObject { ptr: Pointer | null; } export interface ObjectPointerDef { __type: "objectPointer"; } type Prettify = { [K in keyof T]: T[K]; } & {}; export type Simplify = T extends (...args: any[]) => any ? T : T extends object ? Prettify : T; export type PrimitiveToTSType = T extends "u8" | "u16" | "u32" | "i16" | "i32" | "f32" | "f64" ? number : T extends "u64" | "i64" ? bigint | number : T extends "bool_u8" | "bool_u32" ? boolean : T extends "pointer" ? number | bigint : never; type FieldDefInputType = Options extends { packTransform: (value: infer T) => any; } ? T : Def extends PrimitiveType ? PrimitiveToTSType : Def extends "cstring" | "char*" ? string | null : Def extends EnumDef ? keyof E : Def extends StructDef ? InputType : Def extends ObjectPointerDef ? T | null : Def extends readonly [infer InnerDef] ? InnerDef extends PrimitiveType ? Iterable> : InnerDef extends EnumDef ? Iterable : InnerDef extends StructDef ? Iterable : InnerDef extends ObjectPointerDef ? (T | null)[] : never : never; type HasLengthOfField = Fields extends readonly [ infer First, ...infer Rest extends readonly StructField[] ] ? First extends readonly [string, any, { lengthOf: FieldName; }] ? true : HasLengthOfField : false; type FieldDefOutputType = Options extends { unpackTransform: (value: any) => infer T; } ? T : Def extends PrimitiveType ? PrimitiveToTSType : Def extends "cstring" ? string | null : Def extends "char*" ? HasLengthOfField extends true ? string | null : Pointer : Def extends EnumDef ? keyof E : Def extends StructDef ? OutputType : Def extends ObjectPointerDef ? T | null : Def extends readonly [infer InnerDef] ? InnerDef extends PrimitiveType ? Iterable> : InnerDef extends EnumDef ? Iterable : InnerDef extends StructDef ? Iterable : InnerDef extends ObjectPointerDef ? (T | null)[] : never : never; type IsOptional = Options extends { optional: true; } ? true : Options extends { default: any; } ? true : Options extends { lengthOf: string; } ? true : Options extends { condition: () => boolean; } ? true : false; export type StructObjectInputType = { [F in Fields[number] as IsOptional extends false ? F[0] : never]: FieldDefInputType; } & { [F in Fields[number] as IsOptional extends true ? F[0] : never]?: FieldDefInputType | null; }; export type StructObjectOutputType = { [F in Fields[number] as IsOptional extends false ? F[0] : never]: FieldDefOutputType; } & { [F in Fields[number] as IsOptional extends true ? F[0] : never]?: FieldDefOutputType | null; }; export type DefineStructReturnType = StructDef infer R; } ? R : StructObjectOutputType>, Simplify any; } ? V : StructObjectInputType>>; export interface AllocStructOptions { lengths?: Record; } export interface AllocStructResult { buffer: ArrayBuffer; view: DataView; subBuffers?: Record; } export interface EnumDef> { __type: "enum"; type: Exclude; to(value: keyof T): number; from(value: number | bigint): keyof T; enum: T; } type ValidationFunction = (value: any, fieldName: string, options: { hints?: any; input?: any; }) => void | never; interface StructFieldOptions { optional?: boolean; mapOptionalInline?: boolean; unpackTransform?: (value: any) => any; packTransform?: (value: any) => any; lengthOf?: string; asPointer?: boolean; default?: any; condition?: () => boolean; validate?: ValidationFunction | ValidationFunction[]; } type StructField = readonly [string, PrimitiveType, StructFieldOptions?] | readonly [string, EnumDef, StructFieldOptions?] | readonly [string, StructDef, StructFieldOptions?] | readonly [string, "cstring" | "char*", StructFieldOptions?] | readonly [string, ObjectPointerDef, StructFieldOptions?] | readonly [ string, readonly [EnumDef | StructDef | PrimitiveType | ObjectPointerDef], StructFieldOptions? ]; export interface StructFieldPackOptions { validationHints?: any; } export interface StructFieldDescription { name: string; offset: number; size: number; align: number; optional: boolean; type: PrimitiveType | EnumDef | StructDef | "cstring" | "char*" | ObjectPointerDef | readonly [any]; lengthOf?: string; } export interface ArrayFieldMetadata { elementSize: number; arrayOffset: number; lengthOffset: number; lengthPack: (view: DataView, offset: number, value: number) => void; } export interface StructDef { __type: "struct"; size: number; align: number; hasMapValue: boolean; layoutByName: Map; arrayFields: Map; pack(obj: Simplify, options?: StructFieldPackOptions): ArrayBuffer; packInto(obj: Simplify, view: DataView, offset: number, options?: StructFieldPackOptions): void; packList(objects: Simplify[], options?: StructFieldPackOptions): ArrayBuffer; unpack(buf: ArrayBuffer | SharedArrayBuffer): Simplify; unpackList(buf: ArrayBuffer | SharedArrayBuffer, count: number): Simplify[]; describe(): StructFieldDescription[]; } export interface StructDefOptions { default?: Record; mapValue?: (value: any) => any; reduceValue?: (value: any) => any; } export {};