import type { RoUint8Array, RoNeTuple, RoPair, RoArray, TupleWithLength, If } from "@xlabs-xyz/const-utils"; export type NumType = number | bigint; export type PrimitiveType = NumType | RoUint8Array; export type LayoutObject = { readonly [key: string]: any; }; export declare const binaryLiterals: readonly ["int", "uint", "bytes", "array", "switch"]; export type BinaryLiterals = typeof binaryLiterals[number]; export type Endianness = "little" | "big"; export declare const defaultEndianness = "big"; export declare const numberMaxSize = 6; export type NumberSize = 1 | 2 | 3 | 4 | 5 | 6; export type NumSizeToPrimitive = Size extends NumberSize ? number : Size & NumberSize extends never ? bigint : number | bigint; export type FixedConversion = { readonly to: ToType; readonly from: FromType; }; export type CustomConversion = { readonly to: (val: FromType) => ToType; readonly from: (val: ToType) => FromType; }; export interface ItemBase { readonly binary: BL; } interface FixedOmittableCustom { readonly custom: T; readonly omit?: boolean; } export interface LengthPrefixed { readonly lengthSize: NumberSize; readonly lengthEndianness?: Endianness; } interface NumItemBase extends ItemBase> { readonly size: T extends bigint ? number : NumberSize; readonly endianness?: Endianness; } export interface FixedPrimitiveNum extends NumItemBase, FixedOmittableCustom { } export interface OptionalToFromNum extends NumItemBase { readonly custom?: FixedConversion | CustomConversion; } export interface FixedPrimitiveBytes extends ItemBase<"bytes">, FixedOmittableCustom { } export interface FlexPureBytes extends ItemBase<"bytes"> { readonly custom?: RoUint8Array | FixedConversion | CustomConversion; } export interface FlexLayoutBytes extends ItemBase<"bytes"> { readonly custom?: FixedConversion | CustomConversion; readonly layout: Layout; } export interface ManualSizePureBytes extends FlexPureBytes { readonly size: number; } export interface LengthPrefixedPureBytes extends FlexPureBytes, LengthPrefixed { } export interface ManualSizeLayoutBytes extends FlexLayoutBytes { readonly size: number; } export interface LengthPrefixedLayoutBytes extends FlexLayoutBytes, LengthPrefixed { } interface ArrayItemBase extends ItemBase<"array"> { readonly layout: Layout; } export interface FixedLengthArray extends ArrayItemBase { readonly length: number; } export interface LengthPrefixedArray extends ArrayItemBase, LengthPrefixed { } export interface RemainderArray extends ArrayItemBase { } type PlainId = number; type ConversionId = readonly [number, unknown]; type IdProperLayoutPair = RoPair; type IdProperLayoutPairs = RoArray> | RoArray>; type DistributiveAtLeast1 = T extends any ? RoNeTuple : never; export interface SwitchItem extends ItemBase<"switch"> { readonly idSize: NumberSize; readonly idEndianness?: Endianness; readonly idTag?: string; readonly layouts: DistributiveAtLeast1 | IdProperLayoutPair>; } export type NumItem = Signed extends infer S extends boolean ? FixedPrimitiveNum | OptionalToFromNum | FixedPrimitiveNum | OptionalToFromNum : never; export type UintItem = NumItem; export type IntItem = NumItem; export type BytesItem = FixedPrimitiveBytes | FlexPureBytes | ManualSizePureBytes | LengthPrefixedPureBytes | FlexLayoutBytes | ManualSizeLayoutBytes | LengthPrefixedLayoutBytes; export type ArrayItem = FixedLengthArray | LengthPrefixedArray | RemainderArray; export type Item = NumItem | BytesItem | ArrayItem | SwitchItem; export type NamedItem = Item & { readonly name: string; }; export type ProperLayout = RoArray; export type Layout = Item | ProperLayout; type NameOrOmitted = T extends { readonly omit: true; } ? never : T["name"]; export type DeriveType = Layout extends L ? unknown : L extends infer LI extends Item ? ItemToType
  • : L extends infer P extends ProperLayout ? { readonly [I in P[number] as NameOrOmitted]: ItemToType; } : never; type ItemToType = II extends infer I extends Item ? I extends { readonly omit: true; } ? undefined : I extends NumItem ? NumItemToType : I extends BytesItem ? BytesItemToType : I extends ArrayItem ? ArrayItemToType : I extends SwitchItem ? SwitchItemToType : never : never; type NumItemToType = I["custom"] extends CustomConversion ? To : I["custom"] extends FixedConversion ? To : I["custom"] extends undefined ? NumSizeToPrimitive : I["custom"] extends NumType ? I["custom"] : NumSizeToPrimitive; type BytesItemToType = I extends { readonly layout: Layout; } ? I["custom"] extends CustomConversion ? To : I["custom"] extends FixedConversion ? To : DeriveType : I["custom"] extends CustomConversion ? To : I["custom"] extends FixedConversion ? To : RoUint8Array; type ArrayItemToType = DeriveType extends infer DT ? I extends { readonly length: infer AL extends number; } ? number extends AL ? RoArray
    : Readonly> : RoArray
    : never; type MaybeConvert = Id extends RoPair ? Converted : Id; type IdLayoutPairToVariant = Pair extends IdProperLayoutPair ? DeriveType

    extends infer DT extends LayoutObject ? { readonly [K in IdTag | keyof DT]: K extends keyof DT ? DT[K] : MaybeConvert; } : never : never; type IdLayoutPairsToTypeUnion = A extends RoArray ? IdLayoutPairToVariant : never; type SwitchItemToType = IdLayoutPairsToTypeUnion; export {}; //# sourceMappingURL=layout.d.ts.map