import { PropertyParser } from '../types/property-parser.type';
import { EnumAllowedGenericType, EnumType, PrimitiveMap } from '../_types';
import { StringFieldOptions, NumberFieldOptions, BooleanFieldOptions, EnumFieldOptions, DateFieldOptions, RegexFieldOptions, ArrayFieldOptions, ArrayDtoFieldOptions, DtoFieldOptions, CustomFieldOptions } from './field-options.type';
export interface SchemaMap {
    readonly [key: string]: AnyFieldDescriptor;
}
export interface DtoDefinitionRef<TSchema extends SchemaMap = SchemaMap> {
    readonly _uuid: string;
    readonly fields: TSchema;
}
export interface StringFieldDescriptor {
    readonly kind: 'string';
    readonly options: StringFieldOptions;
}
export interface NumberFieldDescriptor {
    readonly kind: 'number';
    readonly options: NumberFieldOptions;
}
export interface IntegerFieldDescriptor {
    readonly kind: 'integer';
    readonly options: NumberFieldOptions;
}
export interface BooleanFieldDescriptor {
    readonly kind: 'boolean';
    readonly options: BooleanFieldOptions;
}
export interface EnumFieldDescriptor<T extends EnumAllowedGenericType = EnumAllowedGenericType> {
    readonly kind: 'enum';
    readonly options: EnumFieldOptions<T>;
    readonly enumObj: EnumType<T>;
}
export interface DateFieldDescriptor {
    readonly kind: 'date';
    readonly options: DateFieldOptions;
}
export interface RegexFieldDescriptor {
    readonly kind: 'regex';
    readonly options: RegexFieldOptions;
    readonly pattern: RegExp;
}
export interface ArrayFieldDescriptor<K extends keyof PrimitiveMap = keyof PrimitiveMap> {
    readonly kind: 'array';
    readonly options: ArrayFieldOptions<PrimitiveMap[K]>;
    readonly itemType: K;
}
export interface ArrayDtoFieldDescriptor<S extends SchemaMap = SchemaMap> {
    readonly kind: 'arrayDto';
    readonly options: ArrayDtoFieldOptions<unknown>;
    readonly dtoDefinition: DtoDefinitionRef<S>;
}
export interface DtoFieldDescriptor<S extends SchemaMap = SchemaMap> {
    readonly kind: 'dto';
    readonly options: DtoFieldOptions<unknown>;
    readonly dtoDefinition: DtoDefinitionRef<S>;
}
export interface CustomFieldDescriptor<T = unknown> {
    readonly kind: 'custom';
    readonly options: CustomFieldOptions<T>;
    readonly parser: PropertyParser<T>;
}
export type AnyFieldDescriptor = StringFieldDescriptor | NumberFieldDescriptor | IntegerFieldDescriptor | BooleanFieldDescriptor | EnumFieldDescriptor | DateFieldDescriptor | RegexFieldDescriptor | ArrayFieldDescriptor | ArrayDtoFieldDescriptor | DtoFieldDescriptor | CustomFieldDescriptor;
