Size: a a a

Clojure — русскоговорящее сообщество

2019 August 27

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
ну, если у топикстартера вообще используется integrant.repl.state, что не факт
источник

AO

Andrey Osnovin in Clojure — русскоговорящее сообщество
А вот тогда такой вопрос, как скомпоновать роуты и хендлеры? Плюс ещё зависимости определённые через ig/ref к ним добавлять
источник

OR

Oleg Roshchupkin in Clojure — русскоговорящее сообщество
Sergey Trofimov
ну, если у топикстартера вообще используется integrant.repl.state, что не факт
Ну, тогда просто то, что возвращается из init
источник

AO

Andrey Osnovin in Clojure — русскоговорящее сообщество
Например :handler/index у меня по пути "/" и ему нужна :db, а для :handler/page "/page/:id" и в зависимостях :db и :analitycs
источник

IG

Ivan Grishaev in Clojure — русскоговорящее сообщество
Andrey Osnovin
А вот тогда такой вопрос, как скомпоновать роуты и хендлеры? Плюс ещё зависимости определённые через ig/ref к ним добавлять
там в главе про это написано. Роуты это компонент, который зависит от db и остального
источник

AO

Andrey Osnovin in Clojure — русскоговорящее сообщество
Ну то есть если использовать  bidi, то будет что-то вроде такого?
(defmethod ig/init-key :handler 
 [_ {:keys [db analytics]}]
 (make-handler ["/" {"" (partial index-handler db)
                     ["page/" :id] (partial page-handler db analytics)}]))
источник

AO

Andrey Osnovin in Clojure — русскоговорящее сообщество
Или вообще как-то так
{:app {:handlers #ig/refset :handler}}

(derive :handler/index :handler)
(derive :handler/page :handler)

(defmethod ig/init-key :app
 [_ {:keys [handlers]}]
 (make-handler ...))
источник

IG

Ivan Grishaev in Clojure — русскоговорящее сообщество
биди нужен просто чтобы сопоставить роут, а что дальше остается на твое усмотрение
источник

IG

Ivan Grishaev in Clojure — русскоговорящее сообщество
если сопоставление прошло, ты получишь ключ роута. Наверное, твой компоннет должен сначала попытаться сопоставить, и если да, то вызвать хендлер-мульт с зависимостями
источник

AR

Andrew Rudenko in Clojure — русскоговорящее сообщество
Andrey Osnovin
Ну то есть если использовать  bidi, то будет что-то вроде такого?
(defmethod ig/init-key :handler 
 [_ {:keys [db analytics]}]
 (make-handler ["/" {"" (partial index-handler db)
                     ["page/" :id] (partial page-handler db analytics)}]))
можно так например:

(require '[integrant.core :as ig])
(require '[bidi.bidi :as bidi])

(defmethod ig/init-key ::handler [_ routes]
 (fn [r]
   (when-let [{:keys [handler route-params]} (bidi/match-route routes (:uri r))]
     (handler (assoc r :route-params route-params)))))

(defmethod ig/init-key ::user [_ {:keys [dependency]}]
 (fn [{{:keys [id]} :route-params}]
   {:status 200
    :body (format "Hey, %s, my dependency is %s" id dependency)}))


(def config
 {::handler ["/"
             {"users/" {[:id "/get"] (ig/ref ::user)}}]
  ::user {:dependency :lala}})

(= (let [system (ig/init config)]
    (try
      ((::handler system) {:uri "/users/andrew/get"})
      (finally
        (ig/halt! system))))
  {:status 200, :body "Hey, andrew, my dependency is :lala"})
источник

AR

Andrew Rudenko in Clojure — русскоговорящее сообщество
еще можно всякого сахара навернуть как вот тут например https://github.com/druids/duct.module.bidi
источник

AR

Andrew Rudenko in Clojure — русскоговорящее сообщество
все что душа пожелает!
источник

MK

Mikhail Kuzmin in Clojure — русскоговорящее сообщество
А есть какая-нибудь функция вроде or только с семантикой some?
Может быть она есть в каких-то утилитах?
Чтобы (X nil nil false) вернуло false.
источник

MK

Mikhail Kuzmin in Clojure — русскоговорящее сообщество
даже не функция, а макрос
источник

AO

Andrey Osnovin in Clojure — русскоговорящее сообщество
Andrew Rudenko
можно так например:

(require '[integrant.core :as ig])
(require '[bidi.bidi :as bidi])

(defmethod ig/init-key ::handler [_ routes]
 (fn [r]
   (when-let [{:keys [handler route-params]} (bidi/match-route routes (:uri r))]
     (handler (assoc r :route-params route-params)))))

(defmethod ig/init-key ::user [_ {:keys [dependency]}]
 (fn [{{:keys [id]} :route-params}]
   {:status 200
    :body (format "Hey, %s, my dependency is %s" id dependency)}))


(def config
 {::handler ["/"
             {"users/" {[:id "/get"] (ig/ref ::user)}}]
  ::user {:dependency :lala}})

(= (let [system (ig/init config)]
    (try
      ((::handler system) {:uri "/users/andrew/get"})
      (finally
        (ig/halt! system))))
  {:status 200, :body "Hey, andrew, my dependency is :lala"})
Мне нравится, спасибо
источник

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
Mikhail Kuzmin
А есть какая-нибудь функция вроде or только с семантикой some?
Может быть она есть в каких-то утилитах?
Чтобы (X nil nil false) вернуло false.
(or nil nil false) возвращает false
источник

MK

Mikhail Kuzmin in Clojure — русскоговорящее сообщество
Sergey Trofimov
(or nil nil false) возвращает false
(or nil nil false true)
пардон
источник

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
(not (or nil nil false true))
=> false
источник

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
😊
источник

MK

Mikhail Kuzmin in Clojure — русскоговорящее сообщество
Sergey Trofimov
(not (or nil nil false true))
=> false
(or nil nil false [1 2 3])
источник