import type { Writer, Reader } from './index.ts' // https://developers.google.com/protocol-buffers/docs/encoding#structure export const CODEC_TYPES = { VARINT: 0, BIT64: 1, LENGTH_DELIMITED: 2, START_GROUP: 3, END_GROUP: 4, BIT32: 5 } export interface EncodeOptions { lengthDelimited?: boolean writeDefaults?: boolean } export interface EncodeFunction { (value: Partial, writer: Writer, opts?: EncodeOptions): void } // protobuf types that contain multiple values type CollectionTypes = any[] | Map // protobuf types that are not collections or messages type PrimitiveTypes = boolean | number | string | bigint | Uint8Array // recursive array/map field length limits type CollectionLimits = { [K in keyof T]: T[K] extends CollectionTypes ? number : T[K] extends PrimitiveTypes ? never : Limits } // recursive array member array/map field length limits type ArrayElementLimits = { [K in keyof T as `${string & K}$`]: T[K] extends Array ? (ElementType extends PrimitiveTypes ? never : Limits) : (T[K] extends PrimitiveTypes ? never : Limits) } // recursive map value array/map field length limits type MapValueLimits = { [K in keyof T as `${string & K}$value`]: T[K] extends Map ? (MapValueType extends PrimitiveTypes ? never : Limits) : (T[K] extends PrimitiveTypes ? never : Limits) } // union of collection and array elements type Limits = Partial & ArrayElementLimits & MapValueLimits> export interface DecodeOptions { /** * Runtime-specified limits for lengths of repeated/map fields */ limits?: Limits } export interface DecodeFunction { (reader: Reader, length?: number, opts?: DecodeOptions): T } export interface StreamFunction { (reader: Reader, length?: number, prefix?: string, opts?: DecodeOptions): Generator } export interface Codec { name: string type: number encode: EncodeFunction decode: DecodeFunction stream: StreamFunction } export function createCodec (name: string, type: number, encode: EncodeFunction, decode: DecodeFunction, stream: StreamFunction): Codec { return { name, type, encode, decode, stream } }