import { AnyJson, JsonMap } from '../../common/jsonTypes';
import { Metadata } from '../../dsl/message';
export type MessageContents = unknown;
export interface SynchronousMessage {
    Request: MessageContents;
    Response: MessageContents[];
}
export interface PluginConfig {
    plugin: string;
    version: string;
}
export interface TransportConfig {
    port: number;
    address: string;
}
export type V4MessagePluginRequestBuilderFunc = (builder: V4SynchronousMessageWithRequestBuilder) => void;
export type V4MessagePluginResponseBuilderFunc = (builder: V4SynchronousMessageWithResponseBuilder) => void;
export interface V4SynchronousPact {
    addSynchronousMessage(description: string): V4UnconfiguredSynchronousMessage;
}
export interface V4UnconfiguredSynchronousMessage {
    given(state: string, parameters?: JsonMap): V4UnconfiguredSynchronousMessage;
    usingPlugin(config: PluginConfig): V4SynchronousMessageWithPlugin;
    withRequest(r: V4MessagePluginRequestBuilderFunc): V4SynchronousMessageWithRequest;
}
export interface V4SynchronousMessageWithPlugin {
    usingPlugin(config: PluginConfig): V4SynchronousMessageWithPlugin;
    withPluginContents(contents: string, contentType: string): V4SynchronousMessageWithPluginContents;
}
export interface V4Message {
    withMetadata(metadata: Metadata): V4Message;
}
export interface V4SynchronousMessageWithRequestBuilder {
    withContent(contentType: string, body: Buffer): V4SynchronousMessageWithRequestBuilder;
    withJSONContent(content: unknown): V4SynchronousMessageWithRequestBuilder;
}
export interface V4SynchronousMessageWithRequest {
    withResponse(builder: V4MessagePluginResponseBuilderFunc): V4SynchronousMessageWithResponse;
}
export interface V4SynchronousMessageWithResponseBuilder {
    withMetadata(metadata: Metadata): V4SynchronousMessageWithResponseBuilder;
    withContent(contentType: string, body: Buffer): V4SynchronousMessageWithResponseBuilder;
    withJSONContent(content: unknown): V4SynchronousMessageWithResponseBuilder;
}
export interface V4SynchronousMessageWithPluginContents {
    executeTest<T>(integrationTest: (m: SynchronousMessage) => Promise<T>): Promise<T | undefined>;
    startTransport(transport: string, address: string, config?: AnyJson): V4SynchronousMessageWithTransport;
}
export interface V4SynchronousMessageWithTransport {
    executeTest<T>(integrationTest: (tc: TransportConfig, m: SynchronousMessage) => Promise<T>): Promise<T | undefined>;
}
export interface V4SynchronousMessageWithResponse {
    executeTest<T>(integrationTest: (m: SynchronousMessage) => Promise<T>): Promise<T | undefined>;
}
