import { AbstractControl } from '@angular/forms';
import type { SafeAny } from '@ngify/core';
import type { AbstractSchema } from './abstract.schema';
import type { SchemaKey } from './types';
/**
 * @public
 */
export declare enum SchemaType {
    Control = 0,
    ControlGroup = 1,
    ControlArray = 2,
    ControlWrapper = 3,
    Component = 4,
    ComponentContainer = 5,
    ComponentWrapper = 6
}
export declare const enum SchemaKind {
    Headless = "headless",
    Headful = "headful",
    Template = "template",
    Row = "row"
}
export interface SchemaLike<Key extends SchemaKey = SchemaKey> {
    kind: string;
    key?: Key;
}
export interface SchemaContext<S extends SchemaLike = AbstractSchema> {
    schema: S;
    /**
     * If there is no corresponding control, the parent control will be returned,
     * usually a `FormGroup` or `FormArray`.
     */
    control: AbstractControl;
    model: SafeAny;
}
export type Length = number | {
    max?: number;
    min?: number;
};
export type SchemaReactiveFn<S extends AbstractSchema, R> = (ctx: SchemaContext<S>) => R;
export type MaybeSchemaReactiveFn<S extends AbstractSchema, R> = R | SchemaReactiveFn<S, R>;
export type WithoutSchemaReactiveFn<T extends MaybeSchemaReactiveFn<AbstractSchema, SafeAny>> = Exclude<T, SchemaReactiveFn<SafeAny, SafeAny>>;
