diff --git a/README.md b/README.md new file mode 100644 index 0000000..1c789bd --- /dev/null +++ b/README.md @@ -0,0 +1,61 @@ +impart +====== + +![MIT license](https://img.shields.io/github/license/writeas/impart.svg) [![Public Slack discussion](http://slack.write.as/badge.svg)](http://slack.write.as/) + +**impart** is a library for the final layer between the API and the consumer. It's used in the latest [Write.as](https://write.as) and [HTMLhouse](https://html.house) APIs. + +We're still in the early stages of development, so there may be breaking changes. + +## Example use + +```go +package main + +import ( + "fmt" + "github.com/writeas/impart" + "net/http" +) + +type handlerFunc func(w http.ResponseWriter, r *http.Request) error + +func main() { + http.HandleFunc("/", handle(index)) + http.ListenAndServe("127.0.0.1:8080", nil) +} + +func index(w http.ResponseWriter, r *http.Request) error { + fmt.Fprintf(w, "Hello world!") + + return nil +} + +func handle(f handlerFunc) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + handleError(w, r, func() error { + // Do authentication... + + // Handle the request + err := f(w, r) + + // Log the request and result... + + return err + }()) + } +} + +func handleError(w http.ResponseWriter, r *http.Request, err error) { + if err == nil { + return + } + + if err, ok := err.(impart.HTTPError); ok { + impart.WriteError(w, err) + return + } + + impart.WriteError(w, impart.HTTPError{http.StatusInternalServerError, "Internal server error :("}) +} +```