impart is a library for the final layer between the API and the consumer. It's used in the latest Write.as and HTMLhouse APIs.
We're still in the early stages of development, so there may be breaking changes.
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 :("})
}