import * as NodeServices from "@effect/platform-node/NodeServices"; import { Cause, Exit, Layer, ManagedRuntime, type Effect } from "effect"; import { CommandRunner, CommandRunnerLive } from "./process.ts"; const AppLayer = CommandRunnerLive.pipe(Layer.provide(NodeServices.layer)); export function createRuntime() { return ManagedRuntime.make(AppLayer); } export type GitInfoRuntime = ReturnType; export async function runEffect( runtime: GitInfoRuntime, effect: Effect.Effect, options: { signal?: AbortSignal; interruptMessage?: string } = {}, ) { const exit = await runtime.runPromiseExit( effect, options.signal ? { signal: options.signal } : undefined, ); if (Exit.isSuccess(exit)) return exit.value; if (Cause.hasInterruptsOnly(exit.cause)) { throw new Error(options.interruptMessage ?? "Operation was aborted."); } const [first] = Cause.prettyErrors(exit.cause); throw new Error(first?.message ?? Cause.pretty(exit.cause)); }