import type { BipedalGenerator } from "../bipedal.js"; import { bipedal } from "../bipedal.js"; import type { AsyncExactReadable } from "../readable.js"; import type { ByobFieldSerializer, DefaultFieldSerializer, } from "./serialize.js"; import { byobFieldSerializer, defaultFieldSerializer } from "./serialize.js"; import type { Field, FieldDeserializeContext, FieldOptions } from "./types.js"; export type BipedalFieldDeserializer = BipedalGenerator< undefined, T, [reader: AsyncExactReadable, context: FieldDeserializeContext] >; // eslint-disable-next-line @typescript-eslint/max-params function _field( size: number, type: "default", serialize: DefaultFieldSerializer, deserialize: BipedalFieldDeserializer, options?: FieldOptions, ): Field; // eslint-disable-next-line @typescript-eslint/max-params function _field( size: number, type: "byob", serialize: ByobFieldSerializer, deserialize: BipedalFieldDeserializer, options?: FieldOptions, ): Field; /* #__NO_SIDE_EFFECTS__ */ // eslint-disable-next-line @typescript-eslint/max-params function _field( size: number, type: "default" | "byob", serialize: DefaultFieldSerializer | ByobFieldSerializer, deserialize: BipedalFieldDeserializer, options?: FieldOptions, ): Field { const field: Field = { size, type: type, serialize: type === "default" ? defaultFieldSerializer( serialize as DefaultFieldSerializer, ) : byobFieldSerializer( size, serialize as ByobFieldSerializer, ), deserialize: bipedal(deserialize) as never, omitInit: options?.omitInit, }; if (options?.init) { field.init = options.init; } return field; } export const field = _field;