import * as Ref from "@confect/core/Ref";
import { type GenericActionCtx } from "convex/server";
import * as Effect from "effect/Effect";
import * as Context from "effect/Context";
import * as Layer from "effect/Layer";
import type * as Schema from "effect/Schema";
const run = Effect.fn("ActionRunner.runAction")(
(effect: Effect.Effect): Effect.Effect => effect,
);
const make = (runAction: GenericActionCtx["runAction"]) => ({
runAction: (
action: Action,
...args: Ref.OptionalArgs
): Effect.Effect<
Ref.Returns,
Ref.Error | Schema.SchemaError
> =>
run(
Ref.runWithCodec(
action,
(args[0] ?? {}) as Ref.Args,
(functionReference, encodedArgs) =>
runAction(functionReference, encodedArgs),
),
),
});
export const ActionRunner = Context.Service>(
"@confect/server/ActionRunner",
);
export type ActionRunner = typeof ActionRunner.Identifier;
export const layer = (runAction: GenericActionCtx["runAction"]) =>
Layer.succeed(ActionRunner, make(runAction));