location.ts 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839
  1. import { Context, Effect, Layer } from "effect"
  2. import { Info, Ref, response } from "@kirincode-ai/schema/location"
  3. import { Project } from "./project"
  4. import { LayerNode } from "./effect/layer-node"
  5. import { makeLocationNode, tags } from "./effect/app-node"
  6. export * as Location from "./location"
  7. export { Info, Ref, response }
  8. export interface Interface extends Info {
  9. readonly vcs?: Project.Vcs
  10. }
  11. export class Service extends Context.Service<Service, Interface>()("@kirincode/Location") {}
  12. export const node = LayerNode.unbound(Service, tags.values.location)
  13. const layer = (ref: Ref) =>
  14. Layer.effect(
  15. Service,
  16. Effect.gen(function* () {
  17. const project = yield* Project.Service
  18. const resolved = yield* project.resolve(ref.directory)
  19. return Service.of({
  20. directory: ref.directory,
  21. workspaceID: ref.workspaceID,
  22. project: { id: resolved.id, directory: resolved.directory },
  23. vcs: resolved.vcs,
  24. })
  25. }),
  26. )
  27. export const boundNode = (ref: Ref) =>
  28. makeLocationNode({
  29. service: Service,
  30. layer: layer(ref),
  31. deps: [Project.node],
  32. })