Skip to content

Commit

Permalink
Good progress
Browse files Browse the repository at this point in the history
  • Loading branch information
BBB committed Nov 29, 2023
1 parent 49beca9 commit a7a3e64
Show file tree
Hide file tree
Showing 2 changed files with 30 additions and 39 deletions.
13 changes: 9 additions & 4 deletions packages/http-client/src/FilterResult.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,12 @@
import { ImmutableRequest } from "~/src/ImmutableRequest";
import { Result, Task } from "@ollierelph/result4t";

export type FilterApply<SuccessIn, FailureIn, SuccessOut, FailureOut> = (
export type FilterApply<
SuccessIn,
FailureIn,
SuccessOut = SuccessIn,
FailureOut = FailureIn,
> = (
next: HttpHandler<SuccessIn, FailureIn>,
) => HttpHandler<SuccessOut, FailureOut>;

Expand Down Expand Up @@ -37,9 +42,9 @@ export class Filter<SuccessIn, FailureIn, SuccessOut, FailureOut> {
FailureIn2 = Other extends Filter<any, infer R, SuccessIn, FailureIn>
? R
: never,
>(filter: Other) {
return new Filter<SuccessIn2, FailureIn2, SuccessOut, FailureOut>((other) =>
this.#task.call(filter.apply(other)),
>(otherFilter: Other) {
return new Filter<SuccessIn2, FailureIn2, SuccessOut, FailureOut>((next) =>
this.#task.call(otherFilter.apply(next)),
);
}

Expand Down
56 changes: 21 additions & 35 deletions packages/http-client/test/FilterResult.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,33 +3,20 @@ import { StatusCode } from "~/src/StatusCode";
import { ImmutableResponse } from "~/src/ImmutableResponse";
import { Result } from "@ollierelph/result4t";
import { expect, it } from "vitest";
import { Filter, HttpHandler, FilterApply } from "~/src/FilterResult";
import { Filter, HttpHandler } from "~/src/FilterResult";
import { ImmutableURL } from "~/src/ImmutableURL";

const setHostnameForEnvironment = (env: string) =>
Filter.from(
<SuccessIn, FailureIn>(
next: HttpHandler<SuccessIn, FailureIn>,
): HttpHandler<SuccessIn, FailureIn> =>
async (request: ImmutableRequest) => {
const finalUrl = request.url.copy({ hostname: `${env}.example.com` });
return next(request.copy({ url: finalUrl }));
},
);
Filter.from((next) => async (request: ImmutableRequest) => {
const finalUrl = request.url.copy({ hostname: `${env}.example.com` });
return next(request.copy({ url: finalUrl }));
});

const addAuth = () =>
Filter.from(
<SuccessIn, FailureIn>(
next: HttpHandler<SuccessIn, FailureIn>,
): HttpHandler<SuccessIn, FailureIn> =>
(request: ImmutableRequest) => {
const finalHeaders = request.headers.append(
"Authorization",
"Basic 123",
);
return next(request.copy({ headers: finalHeaders }));
},
);
Filter.from((next) => (request: ImmutableRequest) => {
const finalHeaders = request.headers.append("Authorization", "Basic 123");
return next(request.copy({ headers: finalHeaders }));
});

const alwaysStatusAndReflectRequest =
(status: StatusCode): HttpHandler<ImmutableResponse, Error> =>
Expand All @@ -43,22 +30,21 @@ const alwaysStatusAndReflectRequest =
);

it("can build a filter chain", async () => {
const chain: Filter<ImmutableResponse, Error, StatusCode, Error> =
setHostnameForEnvironment("stg")
.then(addAuth())
.then(
Filter.from(
(
next: HttpHandler<ImmutableResponse, Error>,
): HttpHandler<StatusCode, Error> =>
(request: ImmutableRequest) =>
next(request).then((res) => res.map((it) => it.status)),
),
);
const chain = setHostnameForEnvironment("stg")
.then(addAuth())
.then(
Filter.from(
(
next: HttpHandler<ImmutableResponse, Error>,
): HttpHandler<StatusCode, Error> =>
(request: ImmutableRequest) =>
next(request).then((res) => res.map((it) => it.status)),
),
);
const client = chain.apply(alwaysStatusAndReflectRequest(StatusCode.OK));
const response = await client(
ImmutableRequest.get(ImmutableURL.fromPathname("/")),
);
expect(response.isSuccess()).toEqual(true);
expect(response.get()).toHaveProperty("status", StatusCode.OK);
expect(response.get()).toHaveProperty("value", StatusCode.OK.value);
});

0 comments on commit a7a3e64

Please sign in to comment.