import {HttpMessage} from "@http4t/core/contract"; import {getHeaderValue} from "@http4t/core/headers"; import {setHeader} from "@http4t/core/messages"; import {success} from "@http4t/result"; import {MessageLens, routeFailed, RoutingResult} from "../lenses"; import {Lenses, named} from "./NamedLenses"; export class HeaderLens implements MessageLens { constructor(readonly name: string) { } async get(output: TMessage): Promise> { const headerValue = getHeaderValue(output.headers, this.name); return headerValue ? success(headerValue) : routeFailed(`Expected header "${this.name}"`, ["headers"]) } async set(into: SetInto, value: string): Promise { return setHeader(into, this.name, value); } } export function header(name: string): MessageLens { return new HeaderLens(name); } export function headers(them: T): MessageLens { const toHeaderLenses = (lenses: Lenses, [name, headerName]: [keyof T, string]): Lenses => { lenses[name] = header(headerName) as any return lenses }; return named(Object.entries(them).reduce(toHeaderLenses, {} as Lenses)) }