Hi All,

I've updated the library from 0.1.5 version with new features:

 - handlers now can branch depending on exception data

(on :error [data]
               (if (> data 5)
                 (escalate :too-big)
                 (continue data)))

 - a additional `fail` handler for short-circuiting default behaviour
 - a 
strategies<https://github.com/zcaudate/ribol/blob/master/test/ribol/test_ribol_strategies.clj>
 document that show different ways of controlling program flow beyond 
try/catch

--

I'd love for some feedback.

Chris

_________________

ribol

ribol is a conditional restart library for clojure inspired by errorkit, 
having a more readable syntax, and designed with the base 
clojure.lang.ExceptionInfo type in mind.
<https://github.com/zcaudate/ribol#installation>Installation:

In project.clj, add to dependencies:

 [im.chit/ribol "0.2.1"]

<https://github.com/zcaudate/ribol#introduction>Introduction

ribol provides a conditional restart system. It can also be thought of as 
an issue resolution system ortry++/catch++. The library provides an 
alternative channel for resolving 'issues' (we use 'issues' here to 
differentiate from 'exceptions', although they are pretty much the same 
thing). It models a management structure, in which issues are reported to 
management, who then what course of action to take depending upon the issue 
and their own level of expertise:

   - 
   
   When circumstances arise that need the attention of higher level 
   processes, an 'issue' would be raised that can be managed by any higher 
   level process.
   - 
   
   An issue must have data as well as additional information attached:
   - options that can be taken to resolve the issue
      - a default option if there is no management intervention.
   - 
   
   Issues are managed through handlers that check for the nature of the 
   issue and come up with the proper resolution process. There are six ways 
   that a manager can deal with a raised issue:
   - directly (same as try/catch)
      - using continue to keep going with a specified value
      - using choose to specify an option
      - using escalate to notify higher level managers
      - using default to allow the issue to resolve itself
      - using fail to throw an exception
   
Using these six different different issue resolution commands, a programmer 
has the richness of language beyond the simple 'try/catch' statement at 
his/her command to be able to craft very complex process control flow 
strategies without mixing logic handling code in the middle tier. It can 
also create new ways of thinking about the problem beyond the standard 
throw/catch mechanism and offer more elegant ways to build programs.

Apart from the tutorial, interested users can peruse the 
strategies<https://github.com/zcaudate/ribol/blob/master/test/ribol/test_ribol_strategies.clj>
 document 
(still a work in progress) to go through common restart strategies.
<https://github.com/zcaudate/ribol#other-libraries>Other Libraries

There are three other conditional restart libraries for clojure - 
errorkit<https://github.com/richhickey/clojure-contrib/blob/master/src/main/clojure/clojure/contrib/error_kit.clj>
, swell <https://github.com/hugoduncan/swell> and 
conditions<https://github.com/bwo/conditions>

   - 
   
   errorkit provided the guiding architecture for ribol. However, ribol 
   updates errorkit with more options for controlling exceptions, uses 
   ex-info which is part of core and has an updated and more understandable 
   syntax.
   - 
   
   swell and conditions are written to work with 
slingshot<https://github.com/scgilardi/slingshot>
    and try+/catch+.
   
<https://github.com/zcaudate/ribol#novel-features>Novel Features
   
   - In addition to the other conditional restart Libraries, ribol offers 
   three more ways of handling error:escalate, fail and default. As of 
   version 0.2 of ribol, handlers are now much more flexible. As far as I 
   can tell, it is the only library that allows this type of resolution 
   switching (having an 'if' form in the 'on' handler to switch between 
   escalate and continue depending on the value of data:

(manage (manage
           (mapv (fn [n]
                   (raise [:error {:data n}]))
                 [1 2 3 4 5 6 7 8])
           (on :error [data]
               (if (> data 5)
                 (escalate :too-big)
                 (continue data))))
          (on :too-big [data]
              (continue (- data))))
  [1 2 3 4 5 -6 -7 -8])


   - Additionally, the follow macros raise-on, raise-on-all and anticipate 
offer 
   ways to hook into the java exceptions. Its use can be seen here: integer 
   division <https://github.com/zcaudate/ribol/wiki/Robust-Integer-Divide>

-- 
-- 
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to clojure@googlegroups.com
Note that posts from new members are moderated - please be patient with your 
first post.
To unsubscribe from this group, send email to
clojure+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
--- 
You received this message because you are subscribed to the Google Groups 
"Clojure" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to clojure+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/groups/opt_out.


Reply via email to