55 lines
1.8 KiB
TypeScript
55 lines
1.8 KiB
TypeScript
import * as InstanceState from "@/effect/instance-state"
|
|
import { File } from "@/file"
|
|
import { Ripgrep } from "@/file/ripgrep"
|
|
import { Effect } from "effect"
|
|
import { HttpApiBuilder } from "effect/unstable/httpapi"
|
|
import { InstanceHttpApi } from "../api"
|
|
|
|
export const fileHandlers = HttpApiBuilder.group(InstanceHttpApi, "file", (handlers) =>
|
|
Effect.gen(function* () {
|
|
const svc = yield* File.Service
|
|
const ripgrep = yield* Ripgrep.Service
|
|
|
|
const findText = Effect.fn("FileHttpApi.findText")(function* (ctx: { query: { pattern: string } }) {
|
|
return (yield* ripgrep
|
|
.search({ cwd: (yield* InstanceState.context).directory, pattern: ctx.query.pattern, limit: 10 })
|
|
.pipe(Effect.orDie)).items
|
|
})
|
|
|
|
const findFile = Effect.fn("FileHttpApi.findFile")(function* (ctx: {
|
|
query: { query: string; dirs?: "true" | "false"; type?: "file" | "directory"; limit?: number }
|
|
}) {
|
|
return yield* svc.search({
|
|
query: ctx.query.query,
|
|
limit: ctx.query.limit ?? 10,
|
|
dirs: ctx.query.dirs !== "false",
|
|
type: ctx.query.type,
|
|
})
|
|
})
|
|
|
|
const findSymbol = Effect.fn("FileHttpApi.findSymbol")(function* () {
|
|
return []
|
|
})
|
|
|
|
const list = Effect.fn("FileHttpApi.list")(function* (ctx: { query: { path: string } }) {
|
|
return yield* svc.list(ctx.query.path)
|
|
})
|
|
|
|
const content = Effect.fn("FileHttpApi.content")(function* (ctx: { query: { path: string } }) {
|
|
return yield* svc.read(ctx.query.path)
|
|
})
|
|
|
|
const status = Effect.fn("FileHttpApi.status")(function* () {
|
|
return yield* svc.status()
|
|
})
|
|
|
|
return handlers
|
|
.handle("findText", findText)
|
|
.handle("findFile", findFile)
|
|
.handle("findSymbol", findSymbol)
|
|
.handle("list", list)
|
|
.handle("content", content)
|
|
.handle("status", status)
|
|
}),
|
|
)
|