run.ts 1.1 KB

1234567891011121314151617181920212223242526272829303132
  1. import { mkdtemp, rm } from "node:fs/promises"
  2. import { tmpdir } from "node:os"
  3. import { join, resolve } from "node:path"
  4. import * as Effect from "effect/Effect"
  5. import * as Process from "../instance/process.js"
  6. import { prepareProgram } from "../script/tooling.js"
  7. export const runProgram = Effect.fn("Cli.runProgram")((file: string) =>
  8. Effect.acquireUseRelease(
  9. Effect.tryPromise({
  10. try: () => mkdtemp(join(tmpdir(), "opencode-drive-run-")),
  11. catch: (cause) => cause,
  12. }),
  13. (artifacts) =>
  14. Effect.gen(function* () {
  15. const runner = yield* Effect.tryPromise({
  16. try: () => prepareProgram(artifacts, resolve(file)),
  17. catch: (cause) => cause,
  18. })
  19. const result = yield* Process.run([process.execPath, runner], {
  20. extendEnv: true,
  21. stdin: "inherit",
  22. stdout: "inherit",
  23. stderr: "inherit",
  24. })
  25. if (result.status !== 0)
  26. return yield* Effect.fail(new Error(`program exited with status ${result.status}`))
  27. return undefined
  28. }),
  29. (artifacts) => Effect.promise(() => rm(artifacts, { recursive: true, force: true })),
  30. ),
  31. )