diff --git a/main.go b/main.go index d58541d..1fa8345 100644 --- a/main.go +++ b/main.go @@ -7,19 +7,55 @@ import ( "net/http" "os" "os/signal" + "reflect" "syscall" "time" ) -func http_new_route[T any](route string, handle_func func(request *http.Request) (T)) { - http.HandleFunc("/" + route, func(w http.ResponseWriter, r *http.Request) { - result, err := json.Marshal(handle_func(r)) +type http_method uint8; const ( + GET http_method = iota + POST + PATCH + PUT + DELETE +) +func (method http_method) to_string() string { + switch method { + case GET: + return http.MethodGet + case POST: + return http.MethodPost + case PATCH: + return http.MethodPatch + case PUT: + return http.MethodPut + case DELETE: + return http.MethodDelete + } + + return "" +} + + +type http_status_code int; const ( + OK http_status_code = http.StatusOK + INTERNAL_SERVER_ERROR http_status_code = http.StatusInternalServerError + BAD_REQUEST http_status_code = http.StatusBadRequest +) + +func http_new_route[T any](method http_method, route string, handle_func func(request *http.Request) (T, http_status_code)) { + http.HandleFunc(method.to_string() + " /" + route, func(response http.ResponseWriter, request *http.Request) { + body, status_code := handle_func(request) + result, err := json.Marshal(body) if err != nil { log.Fatal(err) } + fmt.Println(reflect.VisibleFields(reflect.TypeOf(body))) - w.Write(result) + response.WriteHeader(int(status_code)) + response.Write(result) }) + } func main() { @@ -27,28 +63,27 @@ func main() { Field1 string Field2 http.Header } - foo_route_handler := func(request *http.Request) foo_response_body { - + foo_route_handler := func(request *http.Request) (foo_response_body, http_status_code) { fmt.Println(request.Header) return foo_response_body{ Field1: "hi there on foo!", Field2: request.Header, - } + }, OK } - http_new_route("foo", foo_route_handler) + http_new_route(GET, "foo", foo_route_handler) type bar_response_body struct { Response int Message string } - bar_route_handler := func(request *http.Request) bar_response_body { + bar_route_handler := func(request *http.Request) (bar_response_body, http_status_code) { return bar_response_body{ Response: 400, Message: "hi there on bar!", - } + }, INTERNAL_SERVER_ERROR } - http_new_route("bar", bar_route_handler) + http_new_route(GET, "bar", bar_route_handler) http_server := &http.Server{ Addr: ":8080",