41 lines
		
	
	
		
			935 B
		
	
	
	
		
			Go
		
	
	
			
		
		
	
	
			41 lines
		
	
	
		
			935 B
		
	
	
	
		
			Go
		
	
	
package errcode
 | 
						|
 | 
						|
import (
 | 
						|
	"encoding/json"
 | 
						|
	"net/http"
 | 
						|
)
 | 
						|
 | 
						|
// ServeJSON attempts to serve the errcode in a JSON envelope. It marshals err
 | 
						|
// and sets the content-type header to 'application/json'. It will handle
 | 
						|
// ErrorCoder and Errors, and if necessary will create an envelope.
 | 
						|
func ServeJSON(w http.ResponseWriter, err error) error {
 | 
						|
	w.Header().Set("Content-Type", "application/json")
 | 
						|
	var sc int
 | 
						|
 | 
						|
	switch errs := err.(type) {
 | 
						|
	case Errors:
 | 
						|
		if len(errs) < 1 {
 | 
						|
			break
 | 
						|
		}
 | 
						|
 | 
						|
		if err, ok := errs[0].(ErrorCoder); ok {
 | 
						|
			sc = err.ErrorCode().Descriptor().HTTPStatusCode
 | 
						|
		}
 | 
						|
	case ErrorCoder:
 | 
						|
		sc = errs.ErrorCode().Descriptor().HTTPStatusCode
 | 
						|
		err = Errors{err} // create an envelope.
 | 
						|
	default:
 | 
						|
		// We just have an unhandled error type, so just place in an envelope
 | 
						|
		// and move along.
 | 
						|
		err = Errors{err}
 | 
						|
	}
 | 
						|
 | 
						|
	if sc == 0 {
 | 
						|
		sc = http.StatusInternalServerError
 | 
						|
	}
 | 
						|
 | 
						|
	w.WriteHeader(sc)
 | 
						|
 | 
						|
	return json.NewEncoder(w).Encode(err)
 | 
						|
}
 |