///
import { Opt } from "@effect-ts-app/core/Option";
import { Context } from "@fp-ts/data/Context";
import { Effect } from "@effect/io/Effect";
import type { Predicate } from "@effect-ts/core/Function";
import type { ParsedQuery } from "query-string";
export declare const Method: {
GET: null;
POST: null;
PUT: null;
DELETE: null;
PATCH: null;
};
export type Method = keyof typeof Method;
type Indexed = {
[a in A]: {
[b in B]: any;
};
};
type MakeIndexed> = T;
export type RequestType = "JSON" | "DATA" | "FORM" | "BINARY";
export type RequestBodyTypes = MakeIndexed;
POST: ParsedQuery;
PUT: ParsedQuery;
DELETE: ParsedQuery;
PATCH: ParsedQuery;
};
FORM: {
GET: FormData;
POST: FormData;
PUT: FormData;
DELETE: FormData;
PATCH: FormData;
};
BINARY: {
GET: Buffer;
POST: Buffer;
PUT: Buffer;
DELETE: Buffer;
PATCH: Buffer;
};
}>;
export type ResponseType = "JSON" | "TEXT" | "BINARY";
export type ResponseTypes = MakeIndexed;
export interface DataInput {
[k: string]: unknown;
}
export type Headers = Record;
export interface Response {
body: Opt;
headers: Headers;
status: number;
}
export declare const HttpErrorReason: {
readonly Request: "HttpErrorRequest";
readonly Response: "HttpErrorResponse";
};
export type HttpErrorReason = typeof HttpErrorReason;
export interface HttpResponseError {
_tag: HttpErrorReason["Response"];
response: Response;
}
export declare function isHttpResponseError(u: unknown): u is HttpResponseError;
export interface HttpRequestError {
_tag: HttpErrorReason["Request"];
error: Error;
}
export declare function isHttpRequestError(u: unknown): u is HttpRequestError;
export declare function isHttpError(u: unknown): u is HttpError;
export type HttpError = HttpRequestError | HttpResponseError;
export declare function foldHttpError(onError: (e: Error) => A, onResponseError: (e: Response) => B): (err: HttpError) => A | B;
export interface HttpHeaders extends Record {
}
export declare const HttpHeaders: import("@fp-ts/data/Context").Tag;
export declare function accessHttpHeadersM(eff: (h: Opt) => Effect): import("@effect/io/Effect").Effect;
export declare function accessHttpHeaders(eff: (h: Opt) => A): import("@effect/io/Effect").Effect;
export interface HttpOps {
request(method: M, url: string, requestType: Req, responseType: Resp, headers: Record, body: RequestBodyTypes[Req][M]): Effect, Response>;
}
export interface Http extends HttpOps {
}
export declare const Http: import("@fp-ts/data/Context").Tag;
export type RequestF = (method: M, url: string, requestType: Req, responseType: Resp, body?: RequestBodyTypes[Req][M]) => Effect, Response>;
export type RequestMiddleware = (request: RequestF) => RequestF;
export interface MiddlewareStack {
stack: RequestMiddleware[];
}
export declare const MiddlewareStack: import("@fp-ts/data/Context").Tag;
export declare function accessMiddlewareStackM(eff: (h: Opt) => Effect): import("@effect/io/Effect").Effect;
export declare function accessMiddlewareStack(eff: (h: Opt) => A): import("@effect/io/Effect").Effect;
export declare const LiveMiddlewareStack: (stack?: RequestMiddleware[]) => import("@effect/io/Layer").Layer;
export type RequestEnv = Http;
export declare function requestInner(method: M, url: string, requestType: Req, responseType: Resp, body: RequestBodyTypes[Req][M]): Effect, Response>;
export declare function request(method: "GET", requestType: Req, responseType: Resp): (url: string, body?: RequestBodyTypes[Req]["GET"]) => Effect, Response>;
export declare function request(method: "DELETE", requestType: Req, responseType: Resp): (url: string, body?: RequestBodyTypes[Req]["DELETE"]) => Effect, Response>;
export declare function request(method: M, requestType: Req, responseType: Resp): (url: string, body: RequestBodyTypes[Req][M]) => Effect, Response>;
export declare const get: (url: string, body?: unknown) => import("@effect/io/Effect").Effect, Response>;
export declare const post: (url: string, body: unknown) => import("@effect/io/Effect").Effect, Response>;
export declare const postReturnText: (url: string, body: unknown) => import("@effect/io/Effect").Effect, Response>;
export declare const postData: (url: string, body: ParsedQuery) => import("@effect/io/Effect").Effect, Response>;
export declare const postBinaryGetBinary: (url: string, body: Buffer) => import("@effect/io/Effect").Effect, Response>;
export declare const patch: (url: string, body: unknown) => import("@effect/io/Effect").Effect, Response>;
export declare const patchData: (url: string, body: ParsedQuery) => import("@effect/io/Effect").Effect, Response>;
export declare const patchBinaryGetBinary: (url: string, body: Buffer) => import("@effect/io/Effect").Effect, Response>;
export declare const put: (url: string, body: unknown) => import("@effect/io/Effect").Effect, Response>;
export declare const putData: (url: string, body: ParsedQuery) => import("@effect/io/Effect").Effect, Response>;
export declare const postForm: (url: string, body: FormData) => import("@effect/io/Effect").Effect, Response>;
export declare const putForm: (url: string, body: FormData) => import("@effect/io/Effect").Effect, Response>;
export declare const patchForm: (url: string, body: FormData) => import("@effect/io/Effect").Effect, Response>;
export declare const putBinaryGetBinary: (url: string, body: Buffer) => import("@effect/io/Effect").Effect, Response>;
export declare const del: (url: string, body?: unknown) => import("@effect/io/Effect").Effect, Response>;
export declare const delForm: (url: string, body?: FormData | undefined) => import("@effect/io/Effect").Effect, Response>;
export declare const delData: (url: string, body?: ParsedQuery | undefined) => import("@effect/io/Effect").Effect, Response>;
export declare const delBinaryGetBinary: (url: string, body?: Buffer | undefined) => import("@effect/io/Effect").Effect, Response>;
export declare function withHeaders(headers: Record, replace?: boolean): (eff: Effect) => Effect;
export declare function withPathHeaders(headers: Record, path: Predicate, replace?: boolean): RequestMiddleware;
export declare function foldRequestType(requestType: RequestType, onJson: () => A, onData: () => B, onForm: () => C, onBinary: () => D): A | B | C | D;
export declare function foldResponseType(responseType: ResponseType, onJson: () => A, onText: () => B, onBinary: () => C): A | B | C;
export declare function getMethodAsString(method: Method): "GET" | "DELETE" | "POST" | "PATCH" | "PUT";
export {};
//# sourceMappingURL=http-client.d.ts.map