11import * as HttpRouter from "@effect/platform/HttpRouter"
2+ import * as Array from "effect/Array"
23import * as Effect from "effect/Effect"
3- import { pipe } from "effect/Function"
4+ import { dual , pipe } from "effect/Function"
45import * as Pipeable from "effect/Pipeable"
56
67import * as ApiEndpoint from "../ApiEndpoint.js"
@@ -19,23 +20,26 @@ export const variance = {
1920 /* c8 ignore next */
2021 _A : ( _ : any ) => _ ,
2122 /* c8 ignore next */
22- _E : ( _ : any ) => _ ,
23+ _E : ( _ : never ) => _ ,
2324 /* c8 ignore next */
24- _R : ( _ : any ) => _
25+ _R : ( _ : never ) => _
2526}
2627
2728/** @internal */
2829class HandlerImpl < A extends ApiEndpoint . ApiEndpoint . Any , E , R > implements Handler . Handler < A , E , R > {
2930 readonly [ TypeId ] = variance
3031
31- constructor ( readonly endpoint : A , readonly route : HttpRouter . Route < E , R > ) { }
32+ constructor ( readonly endpoints : ReadonlyArray < A > , readonly router : HttpRouter . HttpRouter < E , R > ) { }
3233
3334 pipe ( ) {
3435 // eslint-disable-next-line prefer-rest-params
3536 return Pipeable . pipeArguments ( this , arguments )
3637 }
3738}
3839
40+ /** @internal */
41+ export const empty = new HandlerImpl ( [ ] , HttpRouter . empty ) as unknown as Handler . Handler < never , never , never > // TODO check variance
42+
3943/** @internal */
4044export const make : {
4145 < A extends ApiEndpoint . ApiEndpoint . Any , E , R > (
@@ -77,8 +81,8 @@ const _makeRaw = <A extends ApiEndpoint.ApiEndpoint.Any, E, R>(
7781 endpoint : A ,
7882 handler : HttpRouter . Route . Handler < E , R >
7983) : Handler . Handler < A , E , R > => {
80- const router = HttpRouter . makeRoute ( ApiEndpoint . getMethod ( endpoint ) , ApiEndpoint . getPath ( endpoint ) , handler )
81- return new HandlerImpl ( endpoint , router )
84+ const route = HttpRouter . makeRoute ( ApiEndpoint . getMethod ( endpoint ) , ApiEndpoint . getPath ( endpoint ) , handler )
85+ return new HandlerImpl ( [ endpoint ] , HttpRouter . fromIterable ( [ route ] ) )
8286}
8387
8488/** @internal */
@@ -110,11 +114,45 @@ const _make = <A extends ApiEndpoint.ApiEndpoint.Any, E, R>(
110114}
111115
112116/** @internal */
113- export const getRoute = < A extends ApiEndpoint . ApiEndpoint . Any , E , R > (
117+ export const getRouter = < A extends ApiEndpoint . ApiEndpoint . Any , E , R > (
114118 handler : Handler . Handler < A , E , R >
115- ) : HttpRouter . Route < E , R > => ( handler as HandlerImpl < A , E , R > ) . route
119+ ) : HttpRouter . HttpRouter < E , R > => ( handler as HandlerImpl < A , E , R > ) . router
116120
117121/** @internal */
118- export const getEndpoint = < A extends ApiEndpoint . ApiEndpoint . Any , E , R > (
122+ export const getEndpoints = < A extends ApiEndpoint . ApiEndpoint . Any , E , R > (
119123 handler : Handler . Handler < A , E , R >
120- ) : A => ( handler as HandlerImpl < A , E , R > ) . endpoint
124+ ) : ReadonlyArray < A > => ( handler as HandlerImpl < A , E , R > ) . endpoints
125+
126+ /** @internal */
127+ export const concat : {
128+ < A extends ApiEndpoint . ApiEndpoint . Any , B extends ApiEndpoint . ApiEndpoint . Any , E1 , E2 , R1 , R2 > (
129+ self : Handler . Handler < A , E1 , R1 > ,
130+ handler : Handler . Handler < B , E2 , R2 >
131+ ) : Handler . Handler < A | B , E1 | E2 , R1 | R2 >
132+
133+ < B extends ApiEndpoint . ApiEndpoint . Any , E2 , R2 > (
134+ handler : Handler . Handler < B , E2 , R2 >
135+ ) : < A extends ApiEndpoint . ApiEndpoint . Any , E1 , R1 > (
136+ self : Handler . Handler < A , E1 , R1 >
137+ ) => Handler . Handler < A | B , E1 | E2 , R1 | R2 >
138+ } = dual ( 2 , < A extends ApiEndpoint . ApiEndpoint . Any , B extends ApiEndpoint . ApiEndpoint . Any , E1 , E2 , R1 , R2 > (
139+ self : Handler . Handler < A , E1 , R1 > ,
140+ handler : Handler . Handler < B , E2 , R2 >
141+ ) : Handler . Handler < A | B , E1 | E2 , R1 | R2 > =>
142+ new HandlerImpl (
143+ [ ...getEndpoints ( self ) , ...getEndpoints ( handler ) ] ,
144+ HttpRouter . concat ( getRouter ( self ) , getRouter ( handler ) )
145+ ) )
146+
147+ /** @internal */
148+ export const concatAll = < Handlers extends ReadonlyArray < Handler . Handler . Any > > (
149+ ...handlers : Handlers
150+ ) : Handler . Handler <
151+ Handler . Handler . Endpoint < Handlers [ number ] > ,
152+ Handler . Handler . Error < Handlers [ number ] > ,
153+ Handler . Handler . Context < Handlers [ number ] >
154+ > =>
155+ new HandlerImpl (
156+ Array . flatten ( handlers . map ( getEndpoints ) ) ,
157+ handlers . map ( getRouter ) . reduce ( HttpRouter . concat , HttpRouter . empty )
158+ )
0 commit comments