import { SERBER_INSTANCE_SYMBOL, SERBER_KEY_SYMBOL, SERBER_PARENT_OBJECT_SYMBOL, SERBER_PATH_SYMBOL, SERBER_ROOT_OBJECT_SYMBOL } from './const';
import { Serber } from './serber';
export interface ISerberPluginDefaultParams {
    [SERBER_INSTANCE_SYMBOL]?: Serber<any>;
    [SERBER_KEY_SYMBOL]?: string | symbol | number;
    [SERBER_PATH_SYMBOL]?: (string | symbol | number)[];
    [SERBER_PARENT_OBJECT_SYMBOL]?: any;
    [SERBER_ROOT_OBJECT_SYMBOL]?: any;
}
export interface ISerberPlugin<Input = any, Output = any, Params extends {
    [key: string]: any;
} = {}> {
    isForSerialize?(obj: Input, options?: Params & ISerberPluginDefaultParams): boolean;
    isForDeserialize?(obj: Output, options?: Params & ISerberPluginDefaultParams): boolean;
    isForSerializeAsync?(obj: Input, options?: Params & ISerberPluginDefaultParams): boolean | Promise<boolean>;
    isForDeserializeAsync?(obj: Output, options?: Params & ISerberPluginDefaultParams): boolean | Promise<boolean>;
    serialize?(obj: Input, options?: Params & ISerberPluginDefaultParams): Output;
    deserialize?(obj: Output, options?: Params & ISerberPluginDefaultParams): Input;
    serializeAsync?(obj: Input, options?: Params & ISerberPluginDefaultParams): Output | Promise<Output>;
    deserializeAsync?(obj: Output, options?: Params & ISerberPluginDefaultParams): Input | Promise<Input>;
    beforeSerialize?(obj: Input, options?: Params & ISerberPluginDefaultParams): void;
    beforeSerializeAsync?(obj: Input, options?: Params & ISerberPluginDefaultParams): void | Promise<void>;
    beforeDeserialize?(obj: Output, options?: Params & ISerberPluginDefaultParams): void;
    beforeDeserializeAsync?(obj: Input, options?: Params & ISerberPluginDefaultParams): void | Promise<void>;
    afterSerialize?(obj: Input, result: Output, options?: Params & ISerberPluginDefaultParams): void;
    afterSerializeAsync?(obj: Input, result: Output, options?: Params & ISerberPluginDefaultParams): void | Promise<void>;
    afterDeserialize?(obj: Output, result: Input, options?: Params & ISerberPluginDefaultParams): void;
    afterDeserializeAsync?(obj: Output, result: Input, options?: Params & ISerberPluginDefaultParams): void | Promise<void>;
    isAlreadySerialized?(obj: Output | Input, options?: Params & ISerberPluginDefaultParams): boolean;
    isAlreadyDeserialized?(obj: Input | Output, options?: Params & ISerberPluginDefaultParams): boolean;
    isAlreadySerializedAsync?(obj: Output | Input, options?: Params & ISerberPluginDefaultParams): boolean | Promise<boolean>;
    isAlreadyDeserializedAsync?(obj: Input | Output, options?: Params & ISerberPluginDefaultParams): boolean | Promise<boolean>;
}
