QueryErrorHandler refactoring
Some checks failed
Lint / lint (push) Failing after 15s

This commit is contained in:
Julien Valverdé
2025-05-30 01:11:10 +02:00
parent 5b64d0d783
commit 21d011dd12

View File

@@ -1,5 +1,4 @@
import { Cause, Context, Effect, identity, Layer, PubSub, Stream } from "effect" import { Cause, Effect, identity, PubSub, Stream } from "effect"
import type { Mutable } from "effect/Types"
export interface QueryErrorHandler<FallbackA, HandledE> { export interface QueryErrorHandler<FallbackA, HandledE> {
@@ -11,31 +10,14 @@ export type Fallback<T> = T extends QueryErrorHandler<infer A, any> ? A : never
export type Error<T> = T extends QueryErrorHandler<any, infer E> ? E : never export type Error<T> = T extends QueryErrorHandler<any, infer E> ? E : never
export interface ServiceResult< export const make = <HandledE = never>() => (
Self, <FallbackA>(
Id extends string,
FallbackA,
HandledE,
> extends Context.TagClass<
Self,
Id,
QueryErrorHandler<FallbackA, HandledE>
> {
readonly Default: Layer.Layer<Self>
}
export const Service = <Self, HandledE = never>() => (
<const Id extends string, FallbackA>(
id: Id,
f: ( f: (
self: Effect.Effect<never, HandledE>, self: Effect.Effect<never, HandledE>,
failure: (failure: HandledE) => Effect.Effect<never>, failure: (failure: HandledE) => Effect.Effect<never>,
defect: (defect: unknown) => Effect.Effect<never>, defect: (defect: unknown) => Effect.Effect<never>,
) => Effect.Effect<FallbackA>, ) => Effect.Effect<FallbackA>
): ServiceResult<Self, Id, FallbackA, HandledE> => { ): Effect.Effect<QueryErrorHandler<FallbackA, HandledE>> => Effect.gen(function*() {
const TagClass = Context.Tag(id)() as ServiceResult<Self, Id, FallbackA, HandledE>
(TagClass as Mutable<typeof TagClass>).Default = Layer.effect(TagClass, Effect.gen(function*() {
const pubsub = yield* PubSub.unbounded<Cause.Cause<HandledE>>() const pubsub = yield* PubSub.unbounded<Cause.Cause<HandledE>>()
const errors = Stream.fromPubSub(pubsub) const errors = Stream.fromPubSub(pubsub)
@@ -52,14 +34,10 @@ export const Service = <Self, HandledE = never>() => (
) )
return { errors, handle } return { errors, handle }
})) })
return TagClass
}
) )
export class DefaultQueryErrorHandler extends Service<DefaultQueryErrorHandler>()( export class DefaultQueryErrorHandler extends Effect.Service<DefaultQueryErrorHandler>()("@reffuse/extension-query/DefaultQueryErrorHandler", {
"@reffuse/extension-query/DefaultQueryErrorHandler", effect: make<never>()(identity)
identity, }) {}
) {}