1import * as Effect from "effect/Effect";
2import * as Layer from "effect/Layer";
3import * as CliOutput from "effect/cli/CliOutput";
4import type * as Prompt from "effect/cli/Prompt";
5import type { Cli } from "../Report.ts";
6import { CliKit } from "./CliKit/CliKit.ts";
7import { LoggingCli } from "./LoggingCli.ts";
8import { plainCliFormatter } from "./PlainCliFormatter.ts";
9
10type SelectedCli = Layer.Layer<Cli, never, CliKit | Prompt.Environment>;
11
12/** Select the interactive or append-only root renderer. */
13export const selectCliServices = () =>
14 Layer.unwrap(
15 Effect.gen(function* () {
16 const cli = yield* CliKit;
17 if (!cli.terminal.input) {
18 const plain: SelectedCli = Layer.mergeAll(
19 LoggingCli,
20 CliOutput.layer(plainCliFormatter({ columns: cli.terminal.columns })),
21 );
22 return plain;
23 }
24
25 return yield* Effect.promise<SelectedCli>(async () => {
26 const { sigilCli } = await import("./components/view/SigilCli.tsx");
27 const { brandedCliFormatter } =
28 await import("./components/view/Help.tsx");
29 return Layer.mergeAll(
30 sigilCli(),
31 CliOutput.layer(brandedCliFormatter(cli)),
32 );
33 });
34 }),
35 );