/// <reference types="node" />
import { AxiosRequestConfig, AxiosResponse, AxiosError } from 'axios';
import { OpenAPI2 } from 'jswagger-common';
import * as http from 'http';
import * as https from 'https';
import * as url from 'url';
export interface IRewriterParams {
    operationId: string;
    arg?: ApiRequestOptionsOO<any, any>;
}
export declare type HostRewriter = (params: IRewriterParams) => {
    protocol?: string;
    host?: string;
} | undefined;
export declare type UrlRewriter = (params: IRewriterParams, originalUrl: url.URL) => url.URL | undefined;
export declare type ArgRewriter = (params: IRewriterParams) => ApiRequestOptionsOO<any, any> | undefined;
/**
 * @return
 *  value >= 0 : retry after *value* ms
 *  false or value < 0 : stop
 */
export declare type RetryHandler = (params: IRewriterParams, retryCount: number, err: any) => Promise<number | false>;
/**
 * @return
 *  string : content-type
 *  null : use default resolver
 */
export declare type ContentTypeResolver = (params: IRewriterParams, data: any) => Promise<string | null>;
export interface ISwaggerClientConfig {
    spec: OpenAPI2;
    protocol?: string;
    host?: string;
    baseUrl?: string;
    httpAgent?: http.Agent;
    httpsAgent?: https.Agent;
    securityContext?: IApiSecurityContext;
    argRewriter?: ArgRewriter;
    hostRewriter?: HostRewriter;
    urlRewriter?: UrlRewriter;
    retryHandler?: RetryHandler;
    contentTypeResolver?: ContentTypeResolver;
}
export interface ISwaggerApiOptions {
    securityContext?: IApiSecurityContext;
}
export interface QueryNameValue {
    name: string;
    value: string;
}
export interface ApiRequestOptions extends AxiosRequestConfig {
    /**
     * Override protocol
     */
    protocol?: string;
    /**
     * Override host
     *
     * e.g. 1.2.3.4:321
     */
    host?: string;
    securityContext?: IApiSecurityContext;
    queries?: QueryNameValue[];
}
export interface ApiRequestOptionsRX<T, P> extends ApiRequestOptions {
    data: T;
}
export interface ApiRequestOptionsRO<T, P> extends ApiRequestOptions {
    data: T;
    params?: P;
}
export interface ApiRequestOptionsRR<T, P> extends ApiRequestOptions {
    data: T;
    params: P;
}
export interface ApiRequestOptionsOX<T, P> extends ApiRequestOptions {
    data?: T;
}
export interface ApiRequestOptionsOO<T, P> extends ApiRequestOptions {
    data?: T;
    params?: P;
}
export interface ApiRequestOptionsOR<T, P> extends ApiRequestOptions {
    data?: T;
    params: P;
}
export interface ApiRequestOptionsXX<T, P> extends ApiRequestOptions {
}
export interface ApiRequestOptionsXO<T, P> extends ApiRequestOptions {
    params?: P;
}
export interface ApiRequestOptionsXR<T, P> extends ApiRequestOptions {
    params: P;
}
export interface ApiResponse<T, H> extends AxiosResponse<T> {
    data: T;
    headers: H;
}
export declare type AnyKeyValueType = {
    [key: string]: any;
};
export interface IApiSecurityContext {
    headerReplacer?: (input: AnyKeyValueType) => AnyKeyValueType;
    queryReplacer?: (input: QueryNameValue[]) => QueryNameValue[];
}
declare const S_API_ERROR: unique symbol;
export declare class ApiError extends Error {
    readonly [S_API_ERROR]: boolean;
    readonly code: string;
    readonly data: any;
    readonly headers: AnyKeyValueType;
    readonly axiosError: AxiosError;
    readonly axiosConfig: AxiosRequestConfig;
    readonly axiosRequest?: any;
    readonly axiosResponse?: AxiosResponse;
    constructor(params: {
        message: string;
        code: string;
        status: number;
        data: any;
        headers: AnyKeyValueType;
        axiosError: AxiosError;
        axiosConfig: AxiosRequestConfig;
        axiosRequest?: any;
        axiosResponse?: AxiosResponse;
    });
    static isInstance(o: any): boolean;
}
declare type IsSwaggerDefinitionFunctionType = (o: any) => boolean;
declare type GetSwaggerDefinitionName = (o: any) => string;
declare type SwaggerDefinitionToJson = (o: any) => any;
export interface ISpecMetadata {
    isSwaggerDefinition: IsSwaggerDefinitionFunctionType;
    getSwaggerDefinitionName: GetSwaggerDefinitionName;
    swaggerDefinitionToJson: SwaggerDefinitionToJson;
    classes: readonly any[];
    definitions: Record<string, any>;
}
export interface IApiMetadata {
    tag: string;
    specMetadata: ISpecMetadata;
}
export {};
//# sourceMappingURL=types.d.ts.map