6cf19ed

Bowmap · bowmap.git · Tickets

Branches > main > 6cf19ed > files / src / net / bowmap

Add table readers and writers

Grahp, 2026-09-06

Commit: 6cf19ed464f1c2a23161ab90c1dc80e5f78e15e9
Parent: 4f918a3

3 changed files:

deps.edn modified (view file)

@@ -3,5 +3,6 @@         :extra-deps {nrepl/nrepl {:mvn/version "1.7.0"}}}}  :deps  {org.clojure/clojure {:mvn/version "1.13.0-alpha6"}+  dev.weavejester/medley {:mvn/version "1.10.0"}   org.clojure/data.json {:mvn/version "2.5.2"}   io.netty/netty-buffer {:mvn/version "4.1.111.Final"}}}

src/net/bowmap/network/frame/readers.clj modified (view file)

@@ -3,6 +3,7 @@    Functions look like ->type, where 'type' is a Minecraft protocol type.    See https://minecraft.wiki/w/Java_Edition_protocol/Packets#Data_types"   (:require+   [medley.core :refer [assoc-some]]    [net.bowmap.network.frame.types :refer [max-varint-size]])   (:import    [io.netty.buffer ByteBuf]@@ -37,3 +38,19 @@ (defn ->enum [reader m]   (fn [buf]     (m (reader buf))))++(defn ->table [schema]+  (fn [buf]+    (reduce (fn [acc [field reader]]+              (assoc-some acc field (reader buf)))+            {} (partition 2 schema))))++(defn to-reader+  "Attempts to coerces 'reader' into a reader. Throws if it cannot.+   Vectors with pairs of [:key reader] are turned into tables readers.+   Nil is coerced to the empty table reader."+  [reader]+  (cond+    (or (vector? reader) (nil? reader)) (->table reader)+    (fn? reader) reader+    :else (throw (IllegalArgumentException. (str "Cannot coerce into reader: " (pr-str reader))))))

src/net/bowmap/network/frame/writers.clj modified (view file)

@@ -3,9 +3,10 @@    Functions look like type->, where 'type' is a Minecraft protocol type.    See https://minecraft.wiki/w/Java_Edition_protocol/Packets#Data_types"   (:require-   [clojure.data.json :as json])+   [clojure.data.json :as json]+   [net.bowmap.network.frame.types :refer [max-varint-size]])   (:import-   [io.netty.buffer ByteBuf]+   [io.netty.buffer ByteBuf CompositeByteBuf Unpooled]    [java.nio.charset Charset]))  (def byte-> ByteBuf/.writeByte)@@ -35,3 +36,26 @@  (defn json-> [buf s]   (string-> buf (json/write-str s)))++(defn length-prefixed+  "Returns a new ByteBuf prefixed by an encoded varint of the length of 'buf'."+  [buf]+  (-> (Unpooled/compositeBuffer 2)+      (CompositeByteBuf/.addComponent true (varint-> (Unpooled/buffer max-varint-size) (ByteBuf/.writerIndex buf)))+      (CompositeByteBuf/.addComponent true buf)))++(defn table-> [schema]+  (fn [buf m]+    (reduce (fn [acc [field writer]]+              (writer acc (get m field)))+            buf (partition 2 schema))))++(defn to-writer+  "Attempts to coerces 'writer' into a writer. Throws if it cannot.+   Vectors with pairs of [:key writer] are turned into tables writers.+   Nil is coerced to the empty table writer."+  [writer]+  (cond+    (or (vector? writer) (nil? writer)) (table-> writer)+    (fn? writer) writer+    :else (throw (IllegalArgumentException. (str "Cannot coerce into writer: " (pr-str writer))))))