[go-nuts] [ANN] gopkg.in/warnings.v0 -- error handling with non-fatal errors (warnings)

2016-08-15 Thread speter . go1
Package warnings implements error handling with non-fatal errors (warnings).

import path:   "gopkg.in/warnings.v0"
package docs:  https://godoc.org/gopkg.in/warnings.v0 
issues:https://github.com/go-warnings/warnings/issues
pull requests: https://github.com/go-warnings/warnings/pulls

A recurring pattern in Go programming is the following:

 func myfunc(params) error {
 if err := doSomething(...); err != nil {
 return err
 }
 if err := doSomethingElse(...); err != nil {
 return err
 }
 if ok := doAnotherThing(...); !ok {
 return errors.New("my error")
 }
 ...
 return nil
 }

This pattern allows interrupting the flow on any received error. But what if
there are errors that should be noted but still not fatal, for which the 
flow
should not be interrupted? Implementing such logic at each if statement 
would
make the code complex and the flow much harder to follow.

Package warnings provides the Collector type and a clean and simple pattern
for achieving such logic. The Collector takes care of deciding when to break
the flow and when to continue, collecting any non-fatal errors (warnings)
along the way. The only requirement is that fatal and non-fatal errors can 
be
distinguished programmatically; that is a function such as

 IsFatal(error) bool

must be implemented. The following is an example of what the above snippet
could look like using the warnings package:

 import "gopkg.in/warnings.v0"

 func isFatal(err error) bool {
 _, ok := err.(WarningType)
 return !ok
 }

 func myfunc(params) error {
 c := warnings.NewCollector(isFatal)
 c.FatalWithWarnings = true
 if err := c.Collect(doSomething()); err != nil {
 return err
 }
 if err := c.Collect(doSomethingElse(...)); err != nil {
 return err
 }
 if ok := doAnotherThing(...); !ok {
 if err := c.Collect(errors.New("my error")); err != nil {
 return err
 }
 }
 ...
 return c.Done()
 }

For an example of a non-trivial code base using this library, see
gopkg.in/gcfg.v1

Rules for using warnings

 - ensure that warnings are programmatically distinguishable from fatal
   errors (i.e. implement an isFatal function and any necessary error types)
 - ensure that there is a single Collector instance for a call of each
   exported function
 - ensure that all errors (fatal or warning) are fed through Collect
 - ensure that every time an error is returned, it is one returned by a
   Collector (from Collect or Done)
 - ensure that Collect is never called after Done

-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to golang-nuts+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.


[go-nuts] [ANN] gopkg.in/gcfg.v1 : gcfg v1.2.0 released

2016-08-14 Thread speter . go1
Gcfg reads "INI-style" text-based configuration files with "name=value" 
pairs grouped into sections (gcfg files).

A lot has been happening to gcfg since my previous announcement. Most 
notably, the project has moved from Google Code:

gopkg.in/gcfg.v1
https://godoc.org/gopkg.in/gcfg.v1
https://github.com/go-gcfg/gcfg/issues
https://github.com/go-gcfg/gcfg/pulls

New features:

experimental (feature/user_vars branch):
- Sections with user-supplied variables (like in git's [alias] section)

v1.2.0:
- Ability to ignore errors due to extra configuration data. This feature is 
enabled by the new gopkg.in/warnings.v0 package which I intend to announce 
shortly (need some more docs).

v1.1.0:
- Ability to specify default values for subsections

v1.0.0 and earlier:
- Create entries for empty subsections
- "Blank" value for multi-valued vars (slices) resets preset values
- Support pointer to slice (allow distinguishing between no values and 
blank value for slice)
- Support for big.Int
- Configurable parsing of int values (Dec and Hex only by default)
- Support for names starting with unicode letters that are neither upper or 
lower case
- Support for encoding/TextUnmarshaler

Thanks to everyone who has provided feedback!

-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to golang-nuts+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.