diff options
author | Alexander Kiryukhin <a.kiryukhin@mail.ru> | 2022-01-05 21:21:51 +0300 |
---|---|---|
committer | Alexander Kiryukhin <a.kiryukhin@mail.ru> | 2022-01-05 21:21:51 +0300 |
commit | b3c48f806724b82b649c89aa5e0d07a09e414140 (patch) | |
tree | 61b5925b2a25c74d1966b757be23168a2663a227 | |
parent | d36bd3f0aa6ee962cc1a0d40bfb6a428da4ff93b (diff) |
Added interfaces
-rw-r--r-- | _examples/headers/main.go | 53 | ||||
-rw-r--r-- | _examples/headers/test.http | 24 | ||||
-rw-r--r-- | _examples/simple/main.go (renamed from _examples/wrap/main.go) | 0 | ||||
-rw-r--r-- | _examples/simple/test.http | 24 | ||||
-rw-r--r-- | _examples/wrap/test.http | 12 | ||||
-rw-r--r-- | wrap.go (renamed from handler.go) | 30 |
6 files changed, 126 insertions, 17 deletions
diff --git a/_examples/headers/main.go b/_examples/headers/main.go new file mode 100644 index 0000000..d0ab968 --- /dev/null +++ b/_examples/headers/main.go @@ -0,0 +1,53 @@ +package main + +import ( + "context" + "fmt" + "log" + "net/http" + + "github.com/gogeneric/api" +) + +func main() { + h := &http.Server{Addr: "0.0.0.0:3000"} + mux := http.NewServeMux() + h.Handler = mux + + // Here is magic! + mux.Handle("/hello", api.Wrap(handleHello)) + + if err := h.ListenAndServe(); err != http.ErrServerClosed { + log.Fatalln(err) + } +} + +func handleHello(ctx context.Context, req *helloRequest) (*helloResponse, error) { + return &helloResponse{Message: fmt.Sprintf("Hello, %s!", req.Name)}, nil +} + +type helloRequest struct { + Name string `json:"name"` + User string +} + +// SetHeaders implements api.WithHeader interface +func (h *helloRequest) WithHeader(header http.Header) { + h.User = header.Get("user") +} + +type helloResponse struct { + Message string `json:"message"` +} + +func test[T IN](x T) { + +} + +type IN interface { + string | int | inter +} + +type inter interface { + String() string +} diff --git a/_examples/headers/test.http b/_examples/headers/test.http new file mode 100644 index 0000000..6efd342 --- /dev/null +++ b/_examples/headers/test.http @@ -0,0 +1,24 @@ +### Request JSON: +http://localhost:3000/hello +Content-Type: application/json + +{ + "name": "Alex" +} + +### Response: +# http://localhost:3000/hello +# +#{"message":"Hello, Alex!"} + +### Request Form: +http://localhost:3000/hello +Content-Type: application/x-www-form-urlencoded + +name=Alex + +### Response: +# http://localhost:3000/hello +# +#{"message":"Hello, Alex!"} + diff --git a/_examples/wrap/main.go b/_examples/simple/main.go index 2248038..2248038 100644 --- a/_examples/wrap/main.go +++ b/_examples/simple/main.go diff --git a/_examples/simple/test.http b/_examples/simple/test.http new file mode 100644 index 0000000..6efd342 --- /dev/null +++ b/_examples/simple/test.http @@ -0,0 +1,24 @@ +### Request JSON: +http://localhost:3000/hello +Content-Type: application/json + +{ + "name": "Alex" +} + +### Response: +# http://localhost:3000/hello +# +#{"message":"Hello, Alex!"} + +### Request Form: +http://localhost:3000/hello +Content-Type: application/x-www-form-urlencoded + +name=Alex + +### Response: +# http://localhost:3000/hello +# +#{"message":"Hello, Alex!"} + diff --git a/_examples/wrap/test.http b/_examples/wrap/test.http deleted file mode 100644 index fd8230c..0000000 --- a/_examples/wrap/test.http +++ /dev/null @@ -1,12 +0,0 @@ -### Request: -http://localhost:3000/hello -Content-Type: application/json - -{ - "name": "Alex" -} - -### Response: -# http://localhost:3000/hello -# -#{"message":"Hello, Alex!"} @@ -3,7 +3,6 @@ package api import ( "context" "encoding/json" - "fmt" "net/http" ) @@ -11,10 +10,14 @@ import ( func Wrap[RQ any, RS any](handler func(ctx context.Context, request *RQ) (RS, error)) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { req := new(RQ) - if err := json.NewDecoder(r.Body).Decode(req); err != nil { - w.WriteHeader(http.StatusBadRequest) - _, _ = w.Write([]byte(fmt.Sprintf("Fail to parse request body: %s", err.Error()))) - return + richifyRequest(req, r) + switch r.Method { + case http.MethodPost, http.MethodPatch, http.MethodDelete, http.MethodPut: + if err := json.NewDecoder(r.Body).Decode(req); err != nil { + w.WriteHeader(http.StatusBadRequest) + _, _ = w.Write([]byte(err.Error())) + return + } } resp, err := handler(r.Context(), req) if err != nil { @@ -29,3 +32,20 @@ func Wrap[RQ any, RS any](handler func(ctx context.Context, request *RQ) (RS, er } } } + +func richifyRequest[RQ any](req *RQ, baseRequest *http.Request) { + if v, ok := (any)(req).(WithHeader); ok { + v.WithHeader(baseRequest.Header) + } + if v, ok := (any)(req).(WithMethod); ok { + v.WithMethod(baseRequest.Method) + } +} + +type WithHeader interface { + WithHeader(header http.Header) +} + +type WithMethod interface { + WithMethod(method string) +} |