Skip to content

Latest commit

 

History

History
150 lines (109 loc) · 3.69 KB

README.adoc

File metadata and controls

150 lines (109 loc) · 3.69 KB

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.