-
-
Notifications
You must be signed in to change notification settings - Fork 149
/
clojuredocs.clj
51 lines (45 loc) · 2.02 KB
/
clojuredocs.clj
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
(ns clojure-lsp.feature.clojuredocs
"clojuredocs integration inspired on orchard implementation."
(:require
[clojure-lsp.http :as http]
[clojure-lsp.logger :as logger]
[clojure-lsp.settings :as settings]
[clojure-lsp.shared :as shared]
[clojure.core.async :as async]
[clojure.edn :as edn]))
(set! *warn-on-reflection* true)
(def ^:private clojuredocs-logger-tag "[Clojuredocs]")
(def ^:private clojuredocs-edn-file-url
"https://github.com/clojure-emacs/clojuredocs-export-edn/raw/master/exports/export.compact.edn")
(defn refresh-cache! [db*]
(when (and (settings/get @db* [:hover :clojuredocs] true)
(not (-> @db* :clojuredocs :refreshing?)))
(logger/info clojuredocs-logger-tag "Refreshing clojuredocs cache...")
(swap! db* assoc-in [:clojuredocs :refreshing?] true)
(shared/logging-time
(str clojuredocs-logger-tag " Refreshing clojuredocs cache took %s.")
(try
(let [;; connection check not to wait too long
[downloadable? conn-ex] (http/test-remote-url! clojuredocs-edn-file-url)]
(if (not downloadable?)
(logger/error clojuredocs-logger-tag "Could not refresh clojuredocs." conn-ex)
(swap! db* assoc :clojuredocs {:cache (-> clojuredocs-edn-file-url
slurp
edn/read-string)})))
(catch Exception e
(logger/error clojuredocs-logger-tag "Error refreshing clojuredocs information." e)
nil)
(finally
(swap! db* assoc-in [:clojuredocs :refreshing?] false))))))
(defn find-docs-for [sym-name sym-ns db*]
(when sym-ns
(let [full-keyword (keyword (str sym-ns) (str sym-name))]
(if-let [cache (-> @db* :clojuredocs :cache)]
(get cache full-keyword)
(do
(async/go
(refresh-cache! db*))
nil)))))
(defn find-hover-docs-for [sym-name sym-ns db*]
(when (settings/get @db* [:hover :clojuredocs] true)
(find-docs-for sym-name sym-ns db*)))