Skip to content

liquidz/merr

Folders and files

NameName
Last commit message
Last commit date

Latest commit

90c8adf · Apr 27, 2024
May 3, 2021
Apr 27, 2024
Mar 8, 2020
Feb 17, 2021
Dec 17, 2022
Dec 17, 2022
Jul 22, 2022
Feb 19, 2021
Apr 8, 2022
Apr 27, 2024
Dec 17, 2022
Dec 17, 2022
Apr 27, 2024
Apr 27, 2024
Jul 22, 2022

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.