import type { AnyMiddlewareFunction, MiddlewareBuilder, MiddlewareFunction } from './middleware';
import type { inferParser, Parser } from './parser';
import type { MutationProcedure, ProcedureType, QueryProcedure, SubscriptionProcedure } from './procedure';
import type { GetRawInputFn, MaybePromise, Overwrite, Simplify } from './types';
type IntersectIfDefined<TType, TWith> = TType extends UnsetMarker ? TWith : Simplify<TType & TWith>;
type ErrorMessage<TMessage extends string> = TMessage;
/** @internal */
export declare const unsetMarker: unique symbol;
type UnsetMarker = typeof unsetMarker;
type DefaultValue<TValue, TFallback> = TValue extends UnsetMarker ? TFallback : TValue;
type ProcedureBuilderDef<TMeta> = {
    procedure: true;
    inputs: Parser[];
    output?: Parser;
    meta?: TMeta;
    resolver?: ProcedureBuilderResolver;
    middlewares: AnyMiddlewareFunction[];
    mutation?: boolean;
    query?: boolean;
    subscription?: boolean;
};
type AnyProcedureBuilderDef = ProcedureBuilderDef<any>;
/**
 * Procedure resolver options
 * @internal
 */
interface ResolverOptions<TContext, _TMeta, TContextOverridesIn, TInputOut> {
    ctx: Simplify<Overwrite<TContext, TContextOverridesIn>>;
    input: TInputOut extends UnsetMarker ? undefined : TInputOut;
}
/**
 * A procedure resolver
 */
type ProcedureResolver<TContext, _TMeta, TContextOverrides, TInputOut, TOutputIn, TOutputOut> = (opts: {
    ctx: Simplify<Overwrite<TContext, TContextOverrides>>;
    input: TInputOut extends UnsetMarker ? undefined : TInputOut;
}) => MaybePromise<DefaultValue<TOutputIn, TOutputOut>>;
export interface ProcedureBuilder<TContext, TMeta, TContextOverrides, TInputIn, TInputOut, TOutputIn, TOutputOut> {
    /**
     * Add an input parser to the procedure.
     * @link https://trpc.io/docs/v11/server/validators
     */
    input<$Parser extends Parser>(schema: TInputOut extends UnsetMarker ? $Parser : inferParser<$Parser>['out'] extends Record<string, unknown> | undefined ? TInputOut extends Record<string, unknown> | undefined ? undefined extends inferParser<$Parser>['out'] ? undefined extends TInputOut ? $Parser : ErrorMessage<'Cannot chain an optional parser to a required parser'> : $Parser : ErrorMessage<'All input parsers did not resolve to an object'> : ErrorMessage<'All input parsers did not resolve to an object'>): ProcedureBuilder<TContext, TMeta, TContextOverrides, IntersectIfDefined<TInputIn, inferParser<$Parser>['in']>, IntersectIfDefined<TInputOut, inferParser<$Parser>['out']>, TOutputIn, TOutputOut>;
    /**
     * Add an output parser to the procedure.
     * @link https://trpc.io/docs/v11/server/validators
     */
    output<$Parser extends Parser>(schema: $Parser): ProcedureBuilder<TContext, TMeta, TContextOverrides, TInputIn, TInputOut, IntersectIfDefined<TOutputIn, inferParser<$Parser>['in']>, IntersectIfDefined<TOutputOut, inferParser<$Parser>['out']>>;
    /**
     * Add a meta data to the procedure.
     * @link https://trpc.io/docs/v11/server/metadata
     */
    meta(meta: TMeta): ProcedureBuilder<TContext, TMeta, TContextOverrides, TInputIn, TInputOut, TOutputIn, TOutputOut>;
    /**
     * Add a middleware to the procedure.
     * @link https://trpc.io/docs/v11/server/middlewares
     */
    use<$ContextOverridesOut>(fn: MiddlewareBuilder<Overwrite<TContext, TContextOverrides>, TMeta, $ContextOverridesOut, TInputOut> | MiddlewareFunction<TContext, TMeta, TContextOverrides, $ContextOverridesOut, TInputOut>): ProcedureBuilder<TContext, TMeta, Overwrite<TContextOverrides, $ContextOverridesOut>, TInputIn, TInputOut, TOutputIn, TOutputOut>;
    /**
     * Query procedure
     * @link https://trpc.io/docs/v11/concepts#vocabulary
     */
    query<$Output>(resolver: ProcedureResolver<TContext, TMeta, TContextOverrides, TInputOut, TOutputIn, $Output>): QueryProcedure<{
        input: DefaultValue<TInputIn, void>;
        output: DefaultValue<TOutputOut, $Output>;
    }>;
    /**
     * Mutation procedure
     * @link https://trpc.io/docs/v11/concepts#vocabulary
     */
    mutation<$Output>(resolver: ProcedureResolver<TContext, TMeta, TContextOverrides, TInputOut, TOutputIn, $Output>): MutationProcedure<{
        input: DefaultValue<TInputIn, void>;
        output: DefaultValue<TOutputOut, $Output>;
    }>;
    /**
     * Subscription procedure
     * @link https://trpc.io/docs/v11/concepts#vocabulary
     */
    subscription<$Output>(resolver: ProcedureResolver<TContext, TMeta, TContextOverrides, TInputOut, TOutputIn, $Output>): SubscriptionProcedure<{
        input: DefaultValue<TInputIn, void>;
        output: DefaultValue<TOutputOut, $Output>;
    }>;
    /**
     * @internal
     */
    _def: ProcedureBuilderDef<TMeta>;
}
type ProcedureBuilderResolver = (opts: ResolverOptions<any, any, any, any>) => Promise<unknown>;
export declare function createBuilder<TContext, TMeta>(initDef?: Partial<AnyProcedureBuilderDef>): ProcedureBuilder<TContext, TMeta, object, UnsetMarker, UnsetMarker, UnsetMarker, UnsetMarker>;
/**
 * @internal
 */
export interface ProcedureCallOptions {
    ctx: unknown;
    getRawInput: GetRawInputFn;
    input?: unknown;
    path: string;
    type: ProcedureType;
}
export {};
//# sourceMappingURL=procedureBuilder.d.ts.map