From c1fcfaaeff72aeebf47a25822f0135fbbde07ef8 Mon Sep 17 00:00:00 2001 From: bptato Date: Sat, 14 Dec 2024 21:23:09 +0100 Subject: client: document readFile, writeFile; add getenv, setenv Both are quite useful. readFile and writeFile got a small makeover in error handling; in particular, readFile now returns null instead of the empty string when the file is missing and writeFile throws a TypeError on I/O errors. --- doc/api.md | 30 ++++++++++++++++++++++++++++++ src/local/client.nim | 39 ++++++++++++++++++++++++++++++++------- 2 files changed, 62 insertions(+), 7 deletions(-) diff --git a/doc/api.md b/doc/api.md index 08e9f234..fae58e51 100644 --- a/doc/api.md +++ b/doc/api.md @@ -71,6 +71,36 @@ SIGTSTP signal.
Note: this suspends the entire process group. + +`readFile(path)` +Read a file at `path`.
+Returns the file's content as a string, or null if the file does not +exist. + + + + +`writeFile(path, content)` +Write `content` to the file at `path`.
+Throws a TypeError if this failed for whatever reason. + + + + +`getenv(name, fallback = null)` +Get an environment variable by `name`.
+Returns `fallback` if the variable does not exist. + + + + +`setenv(name, value)` +Set an environment variable by `name`.
+Throws a type error if the operation failed (e.g. because the variable's +size exceeded an OS-specified limit.) + + + `pager` The pager object. Implements `Pager`, as described below. diff --git a/src/local/client.nim b/src/local/client.nim index f9b10096..e072ea92 100644 --- a/src/local/client.nim +++ b/src/local/client.nim @@ -78,16 +78,41 @@ proc readBlob(client: Client; path: string): WebFile {.jsfunc.} = let name = path.afterLast('/') return newWebFile(name, ps.fd) -#TODO this is dumb -proc readFile(client: Client; path: string): string {.jsfunc.} = +proc readFile(ctx: JSContext; client: Client; path: string): JSValue + {.jsfunc.} = try: - return readFile(path) + return ctx.toJS(readFile(path)) except IOError: - discard + return JS_NULL -#TODO ditto -proc writeFile(client: Client; path, content: string) {.jsfunc.} = - writeFile(path, content) +proc writeFile(ctx: JSContext; client: Client; path, content: string): JSValue + {.jsfunc.} = + try: + writeFile(path, content) + except IOError: + return JS_ThrowTypeError(ctx, "Could not write to file %s", cstring(path)) + return JS_UNDEFINED + +proc getenv(ctx: JSContext; client: Client; s: string; + fallback = JS_NULL): JSValue {.jsfunc.} = + if not existsEnv(s): + return fallback + return ctx.toJS(getEnv(s)) + +proc setenv(ctx: JSContext; client: Client; s: string; val: JSValue): JSValue + {.jsfunc.} = + try: + if JS_IsNull(val): + delEnv(s) + else: + var vals: string + if (let res = ctx.fromJS(val, vals); res.isSome): + putEnv(s, vals) + else: + return JS_EXCEPTION + except OSError: + return JS_ThrowTypeError(ctx, "Failed to set environment variable") + return JS_UNDEFINED proc nimGCStats(client: Client): string {.jsfunc.} = return GC_getStatistics() -- cgit 1.4.1-2-gfad0