A simple command-line tool to start NetBSD virtual machines using QEMU with sensible defaults.
at main 71 lines 1.6 kB view raw
1import { Hono } from "hono"; 2import { Effect, pipe } from "effect"; 3import { 4 createVolumeIfNeeded, 5 handleError, 6 parseCreateVolumeRequest, 7 parseParams, 8 presentation, 9} from "./utils.ts"; 10import { listVolumes } from "../mod.ts"; 11import { deleteVolume, getVolume } from "../volumes.ts"; 12import type { NewVolume } from "../types.ts"; 13import { getImage } from "../images.ts"; 14import { ImageNotFoundError } from "./machines.ts"; 15 16const app = new Hono(); 17 18app.get("/", (c) => 19 Effect.runPromise( 20 pipe( 21 listVolumes(), 22 presentation(c), 23 ), 24 )); 25 26app.get("/:id", (c) => 27 Effect.runPromise( 28 pipe( 29 parseParams(c), 30 Effect.flatMap(({ id }) => getVolume(id)), 31 presentation(c), 32 ), 33 )); 34 35app.delete("/:id", (c) => 36 Effect.runPromise( 37 pipe( 38 parseParams(c), 39 Effect.flatMap(({ id }) => 40 Effect.gen(function* () { 41 const volume = yield* getVolume(id); 42 yield* deleteVolume(id); 43 return volume; 44 }) 45 ), 46 presentation(c), 47 ), 48 )); 49 50app.post("/", (c) => 51 Effect.runPromise( 52 pipe( 53 parseCreateVolumeRequest(c), 54 Effect.flatMap((params: NewVolume) => 55 Effect.gen(function* () { 56 const image = yield* getImage(params.baseImage); 57 if (!image) { 58 return yield* Effect.fail( 59 new ImageNotFoundError({ id: params.baseImage }), 60 ); 61 } 62 63 return yield* createVolumeIfNeeded(image, params.name, params.size); 64 }) 65 ), 66 presentation(c), 67 Effect.catchAll((error) => handleError(error, c)), 68 ), 69 )); 70 71export default app;