Skip to content
/ merr Public

🔥 Minimal and good enough error handling library for Clojure/ClojureScript

License

Notifications You must be signed in to change notification settings

liquidz/merr

Repository files navigation

merr

GitHub Actions for test workflow GitHub Actions for lint workflow GitHub Actions for dependencies workflow codecov

Clojars Project cljdoc badge

Minimal and good enough error handling library for Clojure/ClojureScript (and also Babashka/nbb)

This library is based on "Good Enough" error handling in Clojure.

Concept

  • Easy to imagine behavior

  • Minimum to remember

    • All usage and examples are documented in docstring

(require '[merr.core :as merr])
;; => nil

;; for ClojureScript
;; (require '[merr.core :as merr :include-macros true])

(merr/let +err+ [foo 1
                 bar (merr/error)
                 baz (* bar 2)]
  {:+err+ +err+ :foo foo :bar bar :baz baz})
;; => {:+err+ (merr/error), :foo 1, :bar nil, :baz nil}

Usage

error record

(defrecord MerrError [type message data cause])

let

(merr/let err [a 10
               b (inc a)
               c (inc b)]
  (if err
    (merr/message err)
    (str "c = " c)))
;; => "c = 12"

(merr/let err [a 10
               b (merr/error {:message "ERROR"})
               c (inc b)]
  (if err
    (merr/message err)
    (str "c = " c)))
;; => "ERROR"

(merr/-> 10 (+ 1) (- 1))
;; => 10

(merr/-> 10 ((fn [_] (merr/error))) (- 1))
;; => (merr/error)

→>

(merr/->> 10 (+ 1) (- 1))
;; => -10

(merr/->> 10 ((fn [_] (merr/error))) (- 1))
;; => (merr/error)

try

(merr/try (throw (ex-info "ERROR" {})))
;; => merr/error?

Custom error

You can specify any keywords as :type, but you may want to define and use specific :type of errors in your project. In that case, merr.helper is useful.

(require '[merr.helper :as merr.h])
;; => nil

(def custom-error (partial merr.h/typed-error ::custom-error-type))
;; => var?

(def custom-error? (partial merr.h/typed-error? ::custom-error-type))
;; => var?

(custom-error? (custom-error {:message "custom error"}))
;; => true

typed-error? will check child error types, so you can define sub errors via clojure.core/derive.

(derive ::sub-custom-error-type ::custom-error-type)
;; => nil

(custom-error? (merr/error {:type ::sub-custom-error-type}))
;; => true

Integration

clj-kondo

merr provies clj-kondo’s configuration and hooks. To import configurations, run the following command.

clj-kondo --no-warnings --lint "$(clojure -Spath -Sdeps '{:deps {com.github.liquidz/merr {:mvn/version "LATEST"}}}')"

Support

License

Copyright © 2018-2022 Masashi Iizuka

Distributed under the Eclipse Public License either version 1.0 or (at your option) any later version.