From b9e212687b3602ec355da86ac7df0b8e4106c6ff Mon Sep 17 00:00:00 2001 From: Zuri Klaschka Date: Fri, 6 Sep 2024 22:37:09 +0200 Subject: [PATCH] CLI --- README.md | 4 ++-- deno.json | 9 +++++---- deno.lock | 5 +++++ lib/cli/generate.ts | 17 +++++++++++++++++ lib/cli/help.ts | 16 ++++++++++++++++ lib/cli/server.ts | 29 +++++++++++++++++++++++++++++ main.ts | 32 ++++++++++++++++++-------------- 7 files changed, 92 insertions(+), 20 deletions(-) create mode 100644 lib/cli/generate.ts create mode 100644 lib/cli/help.ts create mode 100644 lib/cli/server.ts diff --git a/README.md b/README.md index 9ae95e1..c287133 100644 --- a/README.md +++ b/README.md @@ -51,7 +51,7 @@ $$ n \in [r_{min}, r]; n = r_{min} + t \mod (r - r_{min}) $$ - [x] Connection to a database - [x] REST API - [x] Visual Web Interface -- [ ] CLI +- [x] CLI - [ ] Bump counter to avoid collissions after restoring backups (where ASNs could have been generated after the time of the backup) - [ ] Analyze time between ASNs, providing the possibility to specify a @@ -61,4 +61,4 @@ $$ n \in [r_{min}, r]; n = r_{min} + t \mod (r - r_{min}) $$ - [ ] Publish on JSR - [ ] Publish on Docker Hub - [x] Publish on GitHub Container Registry -- [ ] UI for quickly searching for ASNs in a DMS +- [x] UI for quickly searching for ASNs in a DMS diff --git a/deno.json b/deno.json index 0cf8f4d..8b0daca 100644 --- a/deno.json +++ b/deno.json @@ -8,13 +8,14 @@ }, "imports": { "$/": "./", + "$cli/": "./lib/cli/", "$common/": "./lib/common/", "$http/": "./lib/http/", - "$cli/": "./lib/cli/", - "@hono/hono": "jsr:@hono/hono@^4.5.11", - "@std/datetime": "jsr:@std/datetime@^0.225.2", "@collinhacks/zod": "npm:zod@^3.23.8", - "@metafloor/bwip-js": "npm:bwip-js@^4.5.1" + "@hono/hono": "jsr:@hono/hono@^4.5.11", + "@metafloor/bwip-js": "npm:bwip-js@^4.5.1", + "@std/cli": "jsr:@std/cli@^1.0.5", + "@std/datetime": "jsr:@std/datetime@^0.225.2" }, "compilerOptions": { "jsx": "precompile", diff --git a/deno.lock b/deno.lock index b4517dc..5df13f4 100644 --- a/deno.lock +++ b/deno.lock @@ -3,6 +3,7 @@ "packages": { "specifiers": { "jsr:@hono/hono@^4.5.11": "jsr:@hono/hono@4.5.11", + "jsr:@std/cli@^1.0.5": "jsr:@std/cli@1.0.5", "npm:@types/node": "npm:@types/node@18.16.19", "npm:bwip-js@^4.5.1": "npm:bwip-js@4.5.1", "npm:zod@^3.23.8": "npm:zod@3.23.8" @@ -10,6 +11,9 @@ "jsr": { "@hono/hono@4.5.11": { "integrity": "5bd6b1a3a503efb746fdcf0aae3ac536dd09229d372988bde5db0798ef64ae4f" + }, + "@std/cli@1.0.5": { + "integrity": "c93cce26ffd26f617c15a12874e1bfeabc90b1eee86017c9639093734c2bf587" } }, "npm": { @@ -31,6 +35,7 @@ "workspace": { "dependencies": [ "jsr:@hono/hono@^4.5.11", + "jsr:@std/cli@^1.0.5", "jsr:@std/datetime@^0.225.2", "npm:bwip-js@^4.5.1", "npm:zod@^3.23.8" diff --git a/lib/cli/generate.ts b/lib/cli/generate.ts new file mode 100644 index 0000000..d92db35 --- /dev/null +++ b/lib/cli/generate.ts @@ -0,0 +1,17 @@ +import { generateASN } from "$common/asn.ts"; +import z from "@collinhacks/zod"; + +const generateArgs = z.object({ + count: z.number().default(1), +}); + +export async function runGenerate(args: unknown) { + const parsedArgs = generateArgs.parse(args); + + new Array(parsedArgs.count).fill(0).map(() => + generateASN({ + client: "cli", + generatedCount: parsedArgs.count, + }).then(asn => asn.asn) + ).forEach(async (x) => console.log(await x)); +} diff --git a/lib/cli/help.ts b/lib/cli/help.ts new file mode 100644 index 0000000..2ac8ed8 --- /dev/null +++ b/lib/cli/help.ts @@ -0,0 +1,16 @@ +export function printHelp() { + const cmd = Deno.args[0]; + console.log(` +Usage: ${cmd} [command] [options] + +Commands: + server Start the server (default) + --port Port to listen on (defaults to the PORT environment variable) + --host Hostname to listen on (defaults to localhost) + generate Generate new ASNs + --count Number of ASNs to generate (defaults to 1) + +Options: + --help Show this help message +`.trim()); +} diff --git a/lib/cli/server.ts b/lib/cli/server.ts new file mode 100644 index 0000000..cd169e3 --- /dev/null +++ b/lib/cli/server.ts @@ -0,0 +1,29 @@ +import { z } from "@collinhacks/zod"; +import { CONFIG, logPaths } from "$common/mod.ts"; +import { httpApp } from "$http/mod.tsx"; +import metadata from "$/deno.json" with { type: "json" }; + +const serverArgs = z.object({ + port: z.number().default(CONFIG.PORT), + host: z.string().default("localhost"), +}); + +export function runServer(args: unknown) { + console.log(`Running ${metadata.name} v${metadata.version}`); + console.log(); + + const parsedArgs = serverArgs.parse(args); + + console.log(`Starting server on ${parsedArgs.host}:${parsedArgs.port}`); + + console.log("Environment Configuration:", CONFIG); + console.log("Arguments:", parsedArgs); + console.log("Paths:"); + logPaths(); + + console.log(); + Deno.serve( + { port: parsedArgs.port, hostname: parsedArgs.host }, + httpApp.fetch, + ); +} diff --git a/main.ts b/main.ts index b8efd5b..80e9d66 100644 --- a/main.ts +++ b/main.ts @@ -1,20 +1,24 @@ -import { getFormatDescription } from "./lib/common/asn.ts"; -import { CONFIG, logPaths, validateDB } from "$common/mod.ts"; -import { httpApp } from "./lib/http/mod.tsx"; -import metadata from "./deno.json" with { type: "json" }; +import { parseArgs } from "@std/cli/parse-args"; +import { validateDB } from "$common/mod.ts"; -if (import.meta.main) { - console.log(`Running ${metadata.name} v${metadata.version}`); - console.log(); - - logPaths(); - - console.log(); +import { runServer } from "$cli/server.ts"; +import { printHelp } from "$cli/help.ts"; +import { runGenerate } from "$cli/generate.ts"; +if (import.meta.main) { await validateDB(); - console.log(getFormatDescription()); + const args = parseArgs(Deno.args); + + if (args.help) { + printHelp(); + Deno.exit(); + } - console.log(); + if (args._[0] === "generate") { + await runGenerate(args); + } - Deno.serve({ port: CONFIG.PORT }, httpApp.fetch); + if (args._[0] === "server" || args._.length === 0) { + await runServer(args); + } }