import type { BufferLengthConverter } from "./buffer.js"; import { buffer } from "./buffer.js"; import type { Field } from "./field/index.js"; import { decodeUtf8, encodeUtf8 } from "./utils.js"; export interface String { (length: number): Field & { as: (infer: T) => Field; }; ( lengthField: K, ): Field> & { as: (infer: T) => Field>; }; ( length: BufferLengthConverter, ): Field> & { as: (infer: T) => Field>; }; ( length: Field, ): Field; } // Prettier will move the annotation and make it invalid // prettier-ignore export const string: String = (/* #__NO_SIDE_EFFECTS__ */ ( lengthOrField: string | number | BufferLengthConverter, ): Field> & { as: (infer: T) => Field>; } => { const field = buffer(lengthOrField as never, { convert: decodeUtf8, back: encodeUtf8, }); (field as never as { as: unknown }).as = () => field; return field as never; }) as never;