refactor(file): decode ripgrep rows with schema

This commit is contained in:
Kit Langton 2026-04-13 10:32:39 -04:00
commit 2a10e4e89e

View file

@ -408,14 +408,6 @@ export namespace Ripgrep {
}) { }) {
return yield* Effect.scoped( return yield* Effect.scoped(
Effect.gen(function* () { Effect.gen(function* () {
const parse = Effect.fn("Ripgrep.parse")(function* (line: string) {
const row = yield* Effect.try({
try: () => Result.parse(JSON.parse(line)),
catch: (cause) => new Error(`invalid ripgrep output: ${cause}`),
})
if (row.type !== "match") return undefined
return row.data
})
const cmd = yield* args({ const cmd = yield* args({
mode: "search", mode: "search",
glob: input.glob, glob: input.glob,
@ -436,8 +428,11 @@ export namespace Ripgrep {
Stream.decodeText(handle.stdout).pipe( Stream.decodeText(handle.stdout).pipe(
Stream.splitLines, Stream.splitLines,
Stream.filter((line) => line.length > 0), Stream.filter((line) => line.length > 0),
Stream.mapEffect(parse), Stream.mapEffect((line) =>
Stream.filter((item): item is Item => item !== undefined), decode(line).pipe(Effect.mapError((cause) => new Error("invalid ripgrep output", { cause }))),
),
Stream.filter((row): row is Schema.Schema.Type<typeof Hit> => row.type === "match"),
Stream.map((row): Item => row.data),
Stream.runCollect, Stream.runCollect,
Effect.map((chunk) => [...chunk]), Effect.map((chunk) => [...chunk]),
), ),