| 1 | import * as Effect from "effect/Effect"; |
| 2 | import * as Layer from "effect/Layer"; |
| 3 | import * as CliOutput from "effect/cli/CliOutput"; |
| 4 | import type * as Prompt from "effect/cli/Prompt"; |
| 5 | import type { Cli } from "../Report.ts"; |
| 6 | import { CliKit } from "./CliKit/CliKit.ts"; |
| 7 | import { LoggingCli } from "./LoggingCli.ts"; |
| 8 | import { plainCliFormatter } from "./PlainCliFormatter.ts"; |
| 9 | |
| 10 | type SelectedCli = Layer.Layer<Cli, never, CliKit | Prompt.Environment>; |
| 11 | |
| 12 | /** Select the interactive or append-only root renderer. */ |
| 13 | export 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 | ); |