import { BaseSource } from "jsr:@shougo/ddu-vim/source";
import { Item } from "jsr:@shougo/ddu-vim/types";

type Never = Record<PropertyKey, never>;

export class Source extends BaseSource<Never> {
  override kind = "nixpkgs";
  gather(): ReadableStream<Item<unknown>[]> {
    return new ReadableStream({
      start: async (controller) => {
        try {
          const names = await new Deno.Command("nix", {
            args: [
              "eval",
              "--extra-experimental-features",
              "nix-command flakes",
              "--raw",
              "nixpkgs#pkgs",
              "--apply",
              "pkgs: builtins.toJSON (builtins.attrNames pkgs)",
            ],
            stdout: "piped",
            stderr: "null",
          }).output()
            .then(({ stdout }) => new Response(stdout).json()) as string[];
          controller.enqueue(names.map((word) => ({
            word,
          })));
        } finally {
          controller.close();
        }
      },
    });
  }
  params(): Never {
    return {};
  }
}