import { readFileSync } from "node:fs"; import { parse } from "@kitchen-md/core"; import { err, ok, type Result } from "neverthrow"; import { render } from "./render.ts"; export type ViewError = { tag: "read-failed"; path: string; cause: string }; export function viewFile(path: string): Result { return readFile(path).map((content) => render(parse(content))); } export function formatViewError(error: ViewError): string { switch (error.tag) { case "read-failed": return `cannot read '${error.path}': ${error.cause}`; } } // The one place a throwing API is turned into a Result; nothing above this leaks exceptions. function readFile(path: string): Result { try { return ok(readFileSync(path, "utf8")); } catch (error) { const cause = error instanceof Error ? error.message : String(error); return err({ tag: "read-failed", path, cause }); } }