import { MethodExample } from './examples.js';
import * as pkg from './package.js';
import * as param from './param.js';
import * as result from './result.js';
import * as type from './type.js';
export interface Client {
    name: string;
    docs: type.Docs;
    options: ClientOptions;
    parameters: Array<param.Parameter>;
    constructors: Array<Constructor>;
    methods: Array<Method | LROMethod | PageableMethod | LROPageableMethod>;
    clientAccessors: Array<ClientAccessor>;
    host?: string;
    templatedHost: boolean;
    parent?: Client;
}
export type ClientOptions = param.ParameterGroup | param.Parameter;
export interface Constructor {
    name: string;
    parameters: Array<param.Parameter>;
}
export interface ClientAccessor {
    name: string;
    subClient: Client;
}
export interface Method {
    name: string;
    docs: type.Docs;
    httpPath: string;
    httpMethod: HTTPMethod;
    parameters: Array<param.Parameter>;
    optionalParamsGroup: param.ParameterGroup;
    responseEnvelope: result.ResponseEnvelope;
    httpStatusCodes: Array<number>;
    client: Client;
    naming: MethodNaming;
    apiVersions: Array<string>;
    examples: Array<MethodExample>;
}
export type HTTPMethod = 'delete' | 'get' | 'head' | 'patch' | 'post' | 'put';
export interface MethodNaming {
    internalMethod: string;
    requestMethod: string;
    responseMethod: string;
}
export interface LROMethod extends Method {
    finalStateVia?: 'azure-async-operation' | 'location' | 'operation-location' | 'original-uri';
    isLRO: true;
    operationLocationResultPath?: string;
}
export interface PageableMethod extends Method {
    nextLinkName?: string;
    nextPageMethod?: NextPageMethod;
    isPageable: true;
}
export interface NextPageMethod {
    name: string;
    httpPath: string;
    httpMethod: HTTPMethod;
    parameters: Array<param.Parameter>;
    httpStatusCodes: Array<number>;
    client: Client;
    apiVersions: Array<string>;
    isNextPageMethod: true;
}
export interface LROPageableMethod extends LROMethod, PageableMethod {
}
export declare function isMethod(method: Method | NextPageMethod): method is Method;
export declare function isLROMethod(method: Method | LROMethod | PageableMethod): method is LROMethod;
export declare function isPageableMethod(method: Method | LROMethod | PageableMethod): method is PageableMethod;
export declare function newClientOptions(modelType: pkg.CodeModelType, clientName: string): ClientOptions;
export declare class Method implements Method {
    constructor(name: string, client: Client, httpPath: string, httpMethod: HTTPMethod, statusCodes: Array<number>, naming: MethodNaming);
}
export declare class Client implements Client {
    constructor(name: string, docs: type.Docs, options: ClientOptions);
}
export declare class Constructor implements Constructor {
    constructor(name: string);
}
export declare class ClientAccessor implements ClientAccessor {
    constructor(name: string, subClient: Client);
}
export declare class MethodNaming implements MethodNaming {
    constructor(internalMethod: string, requestMethod: string, responseMethod: string);
}
export declare class LROMethod extends Method implements LROMethod {
    constructor(name: string, client: Client, httpPath: string, httpMethod: HTTPMethod, statusCodes: Array<number>, naming: MethodNaming);
}
export declare class PageableMethod extends Method implements PageableMethod {
    constructor(name: string, client: Client, httpPath: string, httpMethod: HTTPMethod, statusCodes: Array<number>, naming: MethodNaming);
}
export declare class LROPageableMethod extends Method implements LROPageableMethod {
    constructor(name: string, client: Client, httpPath: string, httpMethod: HTTPMethod, statusCodes: Array<number>, naming: MethodNaming);
}
export declare class NextPageMethod implements NextPageMethod {
    constructor(name: string, client: Client, httpPath: string, httpMethod: HTTPMethod, statusCodes: Array<number>);
}
//# sourceMappingURL=client.d.ts.map