import type { AnalysisContext, Node } from '@hey-api/codegen-core'; import type { py } from '../../py-compiler'; import type { MaybePyDsl } from '../base'; import type { ParamCtor, ParamFn, ParamName } from '../decl/param'; import { ParamPyDsl } from '../decl/param'; import type { BaseCtor, MixinCtor } from './types'; export interface ParamMethods extends Node { /** Renders the parameters into an array of `FunctionParameter`s. */ $params(): ReadonlyArray; /** Adds a parameter. */ param(...args: Parameters): this; /** Adds multiple parameters. */ params(...params: ReadonlyArray>): this; } export function ParamMixin>(Base: TBase) { abstract class Param extends Base { protected _params: Array> = []; override analyze(ctx: AnalysisContext): void { super.analyze(ctx); for (const param of this._params) { ctx.analyze(param); } } protected param(name: ParamName, fn?: ParamFn): this { const p = typeof name === 'function' ? new ParamPyDsl(name) : new ParamPyDsl(name, fn); this._params.push(p); return this; } protected params(...params: ReadonlyArray>): this { this._params.push(...params); return this; } protected $params(): ReadonlyArray { return this.$node(this._params); } } return Param as unknown as MixinCtor; }