import {HttpMessage, HttpRequest, Method} from "@http4t/core/contract"; import {MessageLens, RequestLens} from "./lenses"; import {intersect} from "./lenses/IntersectionLens"; import {expectMethod} from "./lenses/MethodLens"; import {PathLens} from "./lenses/PathLens"; import {literal} from "./paths/Literal"; import {PathMatcher} from "./paths/PathMatcher"; import {named} from "./messages"; export type PathLike = PathMatcher | string; export function request(method: Method, path: string): RequestLens; export function request(method: Method, path: PathMatcher): RequestLens; export function request( method: Method, path: string, body: RequestLens | MessageLens): RequestLens; export function request( method: Method, path: PathLike, body: RequestLens | MessageLens): RequestLens<{ path: TPath, body: TBody }>; export function request( method: Method, pathLike: PathLike, body?: RequestLens | MessageLens ): RequestLens | RequestLens | RequestLens<{ path: TPath, body: TBody }> { const path: RequestLens = typeof pathLike === 'string' ? new PathLens(literal(pathLike)) as any as PathLens : new PathLens(pathLike); const methodAndPath: MessageLens = intersect( expectMethod(method), path); return body ? typeof pathLike === 'string' ? intersect(methodAndPath as any as RequestLens, body) as RequestLens : named({ path: methodAndPath, body }) : methodAndPath; } export {path} from "./paths/index" export * from "./messages" export {method, expectMethod} from "./lenses/MethodLens"