From bec5f04dad667ab973ee55a386695e8cd390b8b7 Mon Sep 17 00:00:00 2001 From: J0sueTM Date: Wed, 7 Aug 2024 17:10:35 -0300 Subject: [PATCH] refactor: mv dynamic loading to `reflection` file --- src/com/moclojer/internal/reflection.clj | 50 ++++++++++++++++++++++++ src/com/moclojer/rq.clj | 38 ------------------ 2 files changed, 50 insertions(+), 38 deletions(-) create mode 100644 src/com/moclojer/internal/reflection.clj diff --git a/src/com/moclojer/internal/reflection.clj b/src/com/moclojer/internal/reflection.clj new file mode 100644 index 0000000..cbf155c --- /dev/null +++ b/src/com/moclojer/internal/reflection.clj @@ -0,0 +1,50 @@ +(ns com.moclojer.internal.reflection + (:require + [camel-snake-kebab.core :as csk] + [clojure.edn :as edn] + [clojure.java.io :as io] + [clojure.string :as str])) + +(defn unpack-parameter + [parameter] + {:type (-> (.. parameter getType getName) + (str/split #"\.") + (last) + (csk/->kebab-case)) + :name (csk/->kebab-case (.getName parameter))}) + +(defn unpack-method + [method] + {:name (csk/->kebab-case (.getName method)) + :parameters (map unpack-parameter (.getParameters method))}) + +(defn reduce-method-overloads + [methods] + (reduce + (fn [overloaded-methods {:keys [name parameters]}] + (let [overload-count (count + (filter + #(str/starts-with? (key %) name) + overloaded-methods)) + cur-overload-id (when (> overload-count 0) overload-count)] + (assoc overloaded-methods (str name cur-overload-id) parameters))) + {} methods)) + +(defn get-klazz-methods + [klazz allowlist] + (->> (.getMethods klazz) + (map unpack-method) + (filter #(contains? allowlist (:name %))) + (reduce-method-overloads))) + +(def ^:private jedis-cmd-allowlist + (-> (io/resource "command-allowlist.edn") + (slurp) + (edn/read-string))) + +(comment + (get-klazz-methods + redis.clients.jedis.JedisPooled + jedis-cmd-allowlist) + ;; + ) diff --git a/src/com/moclojer/rq.clj b/src/com/moclojer/rq.clj index 8bcd310..5b03476 100644 --- a/src/com/moclojer/rq.clj +++ b/src/com/moclojer/rq.clj @@ -26,41 +26,3 @@ "Disconnect and close redis client" ([] (close-client *redis-pool*)) ([client] (.close @client))) - -(comment - ;; (import [java.util Arrays]) - (require '[clojure.string :as str] - '[clojure.java.io :as io] - '[clojure.edn :as edn] - '[camel-snake-kebab.core :as csk]) - (import [redis.clients.jedis JedisPooled]) - - (def allowlist - (-> (io/resource "command-allowlist.edn") - (slurp) - (edn/read-string))) - - (->> (.getMethods JedisPooled) - (map - (fn [class] - {:name (csk/->kebab-case (.getName class)) - :parameters (map - #(identity - {:type (-> (.. % getType getName) - (str/split #"\.") - (last) - (csk/->kebab-case)) - :name (csk/->kebab-case (.getName %))}) - (.getParameters class))})) - (filter #(contains? allowlist (:name %))) - (reduce - (fn [methods {:keys [name parameters]}] - (let [overload-count (count - (filter - #(str/starts-with? (key %) name) - methods)) - cur-overload-id (when (> overload-count 0) overload-count)] - (assoc methods (str name cur-overload-id) parameters))) - {})) - ;; - )