summaryrefslogtreecommitdiffstats
path: root/vendor/gopkg.in/warnings.v0/README
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/gopkg.in/warnings.v0/README')
-rw-r--r--vendor/gopkg.in/warnings.v0/README77
1 files changed, 77 insertions, 0 deletions
diff --git a/vendor/gopkg.in/warnings.v0/README b/vendor/gopkg.in/warnings.v0/README
new file mode 100644
index 000000000..974212ba1
--- /dev/null
+++ b/vendor/gopkg.in/warnings.v0/README
@@ -0,0 +1,77 @@
+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