223 lines
4.2 KiB
Go
223 lines
4.2 KiB
Go
package router
|
|
|
|
import (
|
|
"encoding/json"
|
|
"fmt"
|
|
"io"
|
|
"net/http"
|
|
)
|
|
|
|
type DefaultError uint32
|
|
|
|
const (
|
|
DefaultOk DefaultError = http.StatusOK
|
|
DefaultErrorNotImplemented DefaultError = http.StatusNotImplemented
|
|
DefaultErrorMethodNotAllowed DefaultError = http.StatusMethodNotAllowed
|
|
DefaultErrorBadRequest DefaultError = http.StatusBadRequest
|
|
DefaultErrorUnauthorized DefaultError = http.StatusUnauthorized
|
|
DefaultErrorServerError DefaultError = http.StatusInternalServerError
|
|
)
|
|
|
|
func (e DefaultError) Ok() (ok bool) {
|
|
return e == DefaultOk
|
|
}
|
|
|
|
func (e DefaultError) HttpStatus() (code int) {
|
|
return int(e)
|
|
}
|
|
|
|
func (e DefaultError) String() (out string) {
|
|
switch e {
|
|
case DefaultOk:
|
|
out = "ok"
|
|
case DefaultErrorNotImplemented:
|
|
out = "server not implemented"
|
|
case DefaultErrorMethodNotAllowed:
|
|
out = "method not allowed"
|
|
case DefaultErrorBadRequest:
|
|
out = "bad request"
|
|
case DefaultErrorUnauthorized:
|
|
out = "user unauthorized"
|
|
case DefaultErrorServerError:
|
|
out = "internal server error"
|
|
default:
|
|
out = "unhandled error"
|
|
}
|
|
return
|
|
}
|
|
|
|
func (e DefaultError) Error() (out string) {
|
|
return fmt.Sprintf("%s (%d)", e.String(), e.HttpStatus())
|
|
}
|
|
|
|
func (e DefaultError) BodyBytes() (body []byte) {
|
|
body, _ = json.Marshal(struct{ Error string }{Error: e.String()})
|
|
return
|
|
}
|
|
|
|
type DefaultRequestBuilder struct {
|
|
requestBuilder RequestBuilder
|
|
allowedMethods *[]string
|
|
header struct {
|
|
*Header
|
|
fields header
|
|
}
|
|
values struct {
|
|
*Values
|
|
fields values
|
|
}
|
|
body struct {
|
|
*Body
|
|
fields body
|
|
}
|
|
}
|
|
|
|
func NewDefaultRequestBuilder(rb RequestBuilder, am *[]string, h *Header, hf header, v *Values, vf values, b *Body, bf body) DefaultRequestBuilder {
|
|
if am == nil {
|
|
amd := make([]string, 0)
|
|
am = &amd
|
|
}
|
|
if h == nil || hf == nil {
|
|
hd := make(Header)
|
|
h = &hd
|
|
hfd := struct{ Header }{Header: hd}
|
|
hf = &hfd
|
|
}
|
|
if v == nil || vf == nil {
|
|
vd := make(Values)
|
|
v = &vd
|
|
vfd := struct{ Values }{Values: vd}
|
|
vf = &vfd
|
|
}
|
|
if b == nil || bf == nil {
|
|
bd := make(Body, 0)
|
|
b = &bd
|
|
bfd := struct{ Body }{Body: bd}
|
|
bf = &bfd
|
|
}
|
|
return DefaultRequestBuilder{
|
|
requestBuilder: rb,
|
|
allowedMethods: am,
|
|
header: struct {
|
|
*Header
|
|
fields header
|
|
}{
|
|
Header: h,
|
|
fields: hf,
|
|
},
|
|
values: struct {
|
|
*Values
|
|
fields values
|
|
}{
|
|
Values: v,
|
|
fields: vf,
|
|
},
|
|
body: struct {
|
|
*Body
|
|
fields body
|
|
}{
|
|
Body: b,
|
|
fields: bf,
|
|
},
|
|
}
|
|
}
|
|
|
|
func (rb DefaultRequestBuilder) RequestBuilder() RequestBuilder {
|
|
return rb.requestBuilder
|
|
}
|
|
|
|
func (rb *DefaultRequestBuilder) Allowed(method string) (errRes ErrorResponse) {
|
|
var ok bool
|
|
for _, m := range *rb.allowedMethods {
|
|
if m == method {
|
|
ok = true
|
|
}
|
|
}
|
|
if !ok {
|
|
return DefaultErrorMethodNotAllowed
|
|
}
|
|
return DefaultOk
|
|
}
|
|
|
|
func (rb *DefaultRequestBuilder) Header(header Header) (errRes ErrorResponse) {
|
|
err := rb.header.Header.Parse(header)
|
|
if err != nil {
|
|
return DefaultErrorBadRequest
|
|
}
|
|
return DefaultOk
|
|
}
|
|
|
|
func (rb *DefaultRequestBuilder) ReadBody(body io.ReadCloser) (errRes ErrorResponse) {
|
|
defer body.Close()
|
|
json.NewDecoder(body).Decode(rb.body.fields)
|
|
return DefaultOk
|
|
}
|
|
|
|
func (rb *DefaultRequestBuilder) Values(values Values) (errRes ErrorResponse) {
|
|
err := rb.values.Values.Parse(values)
|
|
if err != nil {
|
|
return DefaultErrorBadRequest
|
|
}
|
|
return DefaultOk
|
|
}
|
|
|
|
type DefaultResponse struct {
|
|
response Response
|
|
header struct {
|
|
*Header
|
|
fields header
|
|
}
|
|
body struct {
|
|
*Body
|
|
fields body
|
|
}
|
|
}
|
|
|
|
func NewDefaultResponse(r Response, h *Header, hf header, b *Body, bf body) DefaultResponse {
|
|
if h == nil || hf == nil {
|
|
hd := make(Header)
|
|
h = &hd
|
|
hfd := struct{ Header }{Header: hd}
|
|
hf = &hfd
|
|
}
|
|
if b == nil || bf == nil {
|
|
bd := make(Body, 0)
|
|
b = &bd
|
|
bfd := struct{ Body }{Body: bd}
|
|
bf = &bfd
|
|
}
|
|
return DefaultResponse{
|
|
response: r,
|
|
header: struct {
|
|
*Header
|
|
fields header
|
|
}{
|
|
Header: h,
|
|
fields: hf,
|
|
},
|
|
body: struct {
|
|
*Body
|
|
fields body
|
|
}{
|
|
Body: b,
|
|
fields: bf,
|
|
},
|
|
}
|
|
}
|
|
|
|
func (r DefaultResponse) Response() Response {
|
|
return &r
|
|
}
|
|
|
|
func (r *DefaultResponse) Header() (header Header) {
|
|
if r.header.Header == nil {
|
|
r.header.Header.Parse(r.header.fields)
|
|
}
|
|
return *r.header.Header
|
|
}
|
|
|
|
func (r *DefaultResponse) BodyBytes() (body []byte) {
|
|
body, _ = json.Marshal(r.body.fields)
|
|
return
|
|
}
|