import * as moment from "moment-timezone";
import { ErrorChain } from "../error";
import * as Validate from "./Validate";
/** Field error codes. */
export declare enum EFieldError {
    InvalidAnd = 0,
    InvalidOr = 1,
    InvalidNot = 2,
    InvalidOptional = 3,
}
/** Field error chain class. */
export declare class FieldError extends ErrorChain {
    constructor(code: EFieldError, value?: any, cause?: Error);
}
/**
 * Fields have validate and format methods.
 * Validate method takes string input and returns typed output.
 * Format method takes typed input and returns string output.
 * Optional context available for additional validation/formatting information.
 */
export declare abstract class Field<T, K = any> {
    abstract validate(value?: string, context?: K): T | null;
    format(value: T, context?: K): string | null;
    and(...fields: Array<Field<T, K>>): Field<T, K>;
    or(...fields: Array<Field<T, K>>): Field<T, K>;
    not(...fields: Array<Field<T, K>>): Field<T, K>;
}
/** Operator field helper. */
export declare abstract class OperatorField<T, K> extends Field<T, K> {
    protected readonly fields: Array<Field<T, K>>;
    constructor(...fields: Array<Field<T, K>>);
}
/** And field wrapper, all input fields used to validate/format values. */
export declare class AndField<T, K> extends OperatorField<T, K> {
    validate(value: string, context?: any): T;
    format(value: T, context?: any): string;
}
/** Or field wrapper, at least one input field used to validate/format values. */
export declare class OrField<T, K> extends OperatorField<T, K> {
    validate(value: string, context?: any): T;
    format(value: T, context?: any): string;
}
/** Not field wrapper, all input fields expected to throw error/fail to format values. */
export declare class NotField<T, K> extends OperatorField<T, K> {
    validate(value: string, context?: any): null;
    format(value: T, context?: any): null;
}
/**
 * Optional field wrapper, if value is defined uses field to validate/format.
 * If value is undefined default or null value is returned.
 */
export declare class OptionalField<T, K> extends Field<T, K> {
    protected readonly field: Field<T, K>;
    protected readonly defaultValue: T | undefined;
    protected readonly formatDefault: string | null;
    constructor(field: Field<T, K>, defaultValue?: T | undefined, context?: any);
    validate(value?: string, context?: any): T | null;
    format(value?: T, context?: any): string | null;
}
export declare class BooleanField extends Field<boolean> {
    protected readonly options: Validate.IValidateBoolean;
    constructor(options?: Validate.IValidateBoolean);
    validate(value: string): boolean;
}
export declare class IntegerField extends Field<number> {
    protected readonly options: Validate.IValidateInteger;
    constructor(options?: Validate.IValidateInteger);
    validate(value: string): number;
}
export declare class FloatField extends Field<number> {
    protected readonly options: Validate.IValidateFloat;
    constructor(options?: Validate.IValidateFloat);
    validate(value: string): number;
}
export declare class HexadecimalField extends Field<number> {
    validate(value: string): number;
    format(value: number): string;
}
export declare class StringField extends Field<string> {
    protected readonly options: Validate.IValidateString;
    constructor(options?: Validate.IValidateString);
    validate(value: string): string;
}
export declare class AsciiField extends Field<string> {
    protected readonly options: Validate.IValidateString;
    constructor(options?: Validate.IValidateString);
    validate(value: string): string;
}
export declare class Base64Field extends Field<string> {
    protected readonly options: Validate.IValidateString;
    constructor(options?: Validate.IValidateString);
    validate(value: string): string;
}
export declare class AlphaField extends Field<string> {
    protected readonly options: Validate.IValidateAlpha;
    constructor(options?: Validate.IValidateAlpha);
    validate(value: string): string;
}
export declare class AlphanumericField extends Field<string> {
    protected readonly options: Validate.IValidateAlphanumeric;
    constructor(options?: Validate.IValidateAlphanumeric);
    validate(value: string): string;
}
export declare class CreditCardField extends Field<string> {
    validate(value: string): string;
}
export declare class EmailField extends Field<string> {
    protected readonly options: Validate.IValidateEmail;
    constructor(options?: Validate.IValidateEmail);
    validate(value: string): string;
}
export declare class DomainField extends Field<string> {
    protected readonly options: Validate.IValidateDomain;
    constructor(options?: Validate.IValidateDomain);
    validate(value: string): string;
}
export declare class HexColourField extends Field<string> {
    validate(value: string): string;
}
export declare class IpField extends Field<string> {
    protected readonly options: Validate.IValidateIp;
    constructor(options?: Validate.IValidateIp);
    validate(value: string): string;
}
export declare class JsonField<T> extends Field<T> {
    validate(value: string): T;
    format(value: T): string;
}
export declare class MacAddressField extends Field<string> {
    validate(value: string): string;
}
export declare class Md5Field extends Field<string> {
    validate(value: string): string;
}
export declare class MobilePhoneField extends Field<string> {
    protected readonly options: Validate.IValidateMobilePhone;
    constructor(options?: Validate.IValidateMobilePhone);
    validate(value: string): string;
}
export declare class MongoIdField extends Field<string> {
    validate(value: string): string;
}
export declare class PostalCodeField extends Field<string> {
    protected readonly options: Validate.IValidatePostalCode;
    constructor(options?: Validate.IValidatePostalCode);
    validate(value: string): string;
}
export declare class UrlField extends Field<string> {
    protected readonly options: Validate.IValidateUrl;
    constructor(options?: Validate.IValidateUrl);
    validate(value: string): string;
}
export declare class UuidField extends Field<string> {
    protected readonly options: Validate.IValidateUuid;
    constructor(options?: Validate.IValidateUuid);
    validate(value: string): string;
}
export declare class PortField extends Field<number> {
    validate(value: string): number;
}
export declare class LanguageField extends Field<string> {
    validate(value: string): string;
}
export declare class CountryField extends Field<string> {
    validate(value: string): string;
}
export declare class LocaleField extends Field<string> {
    protected readonly options: Validate.IValidateLocale;
    constructor(options?: Validate.IValidateLocale);
    validate(value: string): string;
}
export declare class TimeZoneField extends Field<string> {
    validate(value: string): string;
}
export declare class DateField extends Field<moment.Moment> {
    protected readonly options: Validate.IValidateDate;
    constructor(options?: Validate.IValidateDate);
    validate(value: string): moment.Moment;
    format(value: moment.Moment): string;
}
export declare class DurationField extends Field<moment.Duration> {
    protected readonly options: Validate.IValidateDuration;
    constructor(options?: Validate.IValidateDuration);
    validate(value: string): moment.Duration;
    format(value: moment.Duration): string;
}
