GitHub

Folders and files

NameName

Last commit message

Last commit date

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)

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"}}}')"

License

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

Read the original on github.com ↗