aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChloe Kudryavtsev <code@toast.bunkerlabs.net>2023-03-24 14:49:00 -0400
committerChloe Kudryavtsev <code@toast.bunkerlabs.net>2023-03-24 14:49:00 -0400
commitb7a993eeceb746877230917d02b1937217d17ad4 (patch)
tree356836134fdca3ce126095073e1168f24f787af0
parentnative: fix warning (diff)
janet: add writer helper module
-rw-r--r--jurl/writer.janet39
1 files changed, 39 insertions, 0 deletions
diff --git a/jurl/writer.janet b/jurl/writer.janet
new file mode 100644
index 0000000..589271e
--- /dev/null
+++ b/jurl/writer.janet
@@ -0,0 +1,39 @@
+# writer.janet: utility for consistent :readfunction and mime :data-cb use
+(defn- read-cb
+ [self bytes]
+ (def start (self :pos))
+ (def end (min (length (self :buf)) (+ (self :pos) bytes)))
+ (put self :pos end)
+ (string/slice (self :buf) start end))
+
+# no safety checks, just for fun
+(defn- seek-cb
+ [self offset &opt pos]
+ (default pos :set)
+ (put self :pos (case pos
+ :set offset
+ :cur (+ (self :pos) offset)
+ :end (- (length (self :buf)) offset))))
+
+(defn- make-buf
+ [b]
+ (assert (bytes? b))
+ (def buf (freeze b))
+ @{:pos 0
+ :buf buf
+ :read read-cb
+ :seek seek-cb})
+
+# returns a function you can put into :readfunction
+(defn make-writer
+ [b]
+ (def buf (make-buf b))
+ |(:read buf $))
+
+# returns a function you can put into mime_data_cb
+(defn make-mime-writer
+ [b]
+ (def buf (make-buf b))
+ (fn [mode & args]
+ (assert (keyword? mode))
+ (mode buf ;args)))