Component with Compojure

Долгое время задавал себе вопрос изоляции внешних зависимостей в Clojure. Чувствовал что чего то не хватает. Время шло, а этот вопрос местами грыз меня.

Где то в 2013 блуждая в интернете увидел презентацию Clojure in the Large. В ней частично затрагивалась данная проблема, но полностью решение найдено не было. Вопросов появилось больше чем ответов.

Весной 2014 в скайп прилетела ссылка Stuart Sierra - Components Just Enough Structure, в ней расскажзывалось про Component и она вселила надежду.

Начали использовать Component в проекте, и все было хорошо. Пока не наступил момент интеграции Compojure с Component. Возникли проблемы, они конечно решались, но кода было как то слишком много.

Решив уменьшить количество кода, упростить понимание и сделать мир лучше сделал макрос цель которого принять на себя боль интеграции Compojure с Component.

Макрос выделил в отдельную библиотеку, назвал ее comcomp.

Теперь компонент с роутами можно описать вот так:

(defroutes-with-deps
                       RoutesComponent      ; <- Component name

                       [first-dep second-dep]        ; <- Dependency list.

                       (GET "/hello" [] (some-func first-dep))          ; <- Routes spec
                       (POST "/word" [] (some-second-func second-dep))) ;You can use
                                                                        ;previously defined
                                                                        ;dependencies
Written on May 1, 2014