import { type Pointer } from "bun:ffi"; export declare const pointerSize: number; export type PrimitiveType = 'u8' | 'u16' | 'u32' | 'u64' | 'f32' | 'f64' | 'pointer' | 'i32' | 'i16' | 'bool_u8' | 'bool_u32'; interface PointyObject { ptr: Pointer | number | bigint | null; } interface ObjectPointerDef { __type: 'objectPointer'; } /** * Type helper for creating object pointers for structs. */ export declare function objectPtr(): ObjectPointerDef; type Prettify = { [K in keyof T]: T[K]; } & {}; export type Simplify = T extends (...args: any[]) => any ? T : T extends object ? Prettify : T; type PrimitiveToTSType = T extends 'u8' | 'u16' | 'u32' | 'i16' | 'i32' | 'f32' | 'f64' ? number : T extends 'u64' ? bigint | number : T extends 'bool_u8' | 'bool_u32' ? boolean : T extends 'pointer' ? number | bigint : never; type FieldDefInputType = 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 FieldDefOutputType = Def extends PrimitiveType ? PrimitiveToTSType : Def extends 'cstring' | 'char*' ? string | null : 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; }; type DefineStructReturnType = StructDef infer R; } ? R : StructObjectOutputType>, Simplify any; } ? V : StructObjectInputType>>; interface AllocStructOptions { lengths?: Record; } interface AllocStructResult { buffer: ArrayBuffer; view: DataView; subBuffers?: Record; } export declare function allocStruct(structDef: StructDef, options?: AllocStructOptions): AllocStructResult; export interface EnumDef> { __type: 'enum'; type: Exclude; to(value: keyof T): number; from(value: number | bigint): keyof T; enum: T; } export declare function defineEnum>(mapping: T, base?: Exclude): EnumDef; 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; unpack(buf: ArrayBuffer | SharedArrayBuffer): Simplify; describe(): StructFieldDescription[]; } export interface StructDefOptions { default?: Record; mapValue?: (value: any) => any; reduceValue?: (value: any) => any; } export declare function packObjectArray(val: (PointyObject | null)[]): DataView; export declare function defineStruct(fields: Fields & StructField[], structDefOptions?: Opts): DefineStructReturnType; export {};