Skip to content

Commit

Permalink
feat(core): restructure for v1
Browse files Browse the repository at this point in the history
  • Loading branch information
ConsoleTVs committed Oct 6, 2024
1 parent bbe08c2 commit 4caac61
Show file tree
Hide file tree
Showing 11 changed files with 238 additions and 228 deletions.
44 changes: 31 additions & 13 deletions builder.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package akumu
import (
"bytes"
"encoding/json"
"errors"
"io"
"net/http"
)
Expand All @@ -19,6 +20,10 @@ type Builder struct {
writer func(writer http.ResponseWriter)
}

var (
ErrWriterRequiresFlusher = errors.New("response writer requires a flusher")
)

func writeHeaders(writer http.ResponseWriter, builder Builder) bool {
for key, values := range builder.headers {
for _, value := range values {
Expand All @@ -32,17 +37,19 @@ func writeHeaders(writer http.ResponseWriter, builder Builder) bool {
}

func DefaultResponderHandler(writer http.ResponseWriter, request *http.Request, builder Builder) {
onError, hasOnError := request.Context().Value(OnErrorKey{}).(OnErrorHook)

if builder.err != nil {
parent := builder.WithoutError()
handleError(writer, request, builder.err, &parent)
handle(writer, request, builder.err, &parent)

return
}

if builder.writer != nil {
if writeHeaders(writer, builder) {
if ctx, ok := Context(request); ok {
ctx.handleError(ServerError{
if hasOnError {
onError(ServerError{
Code: builder.status,
URL: request.URL.String(),
Text: http.StatusText(builder.status),
Expand All @@ -59,16 +66,16 @@ func DefaultResponderHandler(writer http.ResponseWriter, request *http.Request,
body, err := io.ReadAll(builder.body)

if err != nil {
NewProblemFromError(err, http.StatusInternalServerError).
NewProblem(err, http.StatusInternalServerError).
Respond(request).
Handle(writer, request)

return
}

if writeHeaders(writer, builder) {
if ctx, ok := Context(request); ok {
ctx.handleError(ServerError{
if hasOnError {
onError(ServerError{
Code: builder.status,
URL: request.URL.String(),
Text: http.StatusText(builder.status),
Expand All @@ -84,9 +91,19 @@ func DefaultResponderHandler(writer http.ResponseWriter, request *http.Request,
}

if builder.stream != nil {
flusher, ok := writer.(http.Flusher)

if !ok {
NewProblem(ErrWriterRequiresFlusher, http.StatusInternalServerError).
Respond(request).
Handle(writer, request)

return
}

if writeHeaders(writer, builder) {
if ctx, ok := Context(request); ok {
ctx.handleError(ServerError{
if hasOnError {
onError(ServerError{
Code: builder.status,
URL: request.URL.String(),
Text: http.StatusText(builder.status),
Expand All @@ -95,7 +112,7 @@ func DefaultResponderHandler(writer http.ResponseWriter, request *http.Request,
}
}

writer.(http.Flusher).Flush()
flusher.Flush()

for {
select {
Expand All @@ -106,15 +123,16 @@ func DefaultResponderHandler(writer http.ResponseWriter, request *http.Request,
return
}

writer.Write(message)
writer.(http.Flusher).Flush()
_, _ = writer.Write(message)

flusher.Flush()
}
}
}

if writeHeaders(writer, builder) {
if ctx, ok := Context(request); ok {
ctx.handleError(ServerError{
if hasOnError {
onError(ServerError{
Code: builder.status,
URL: request.URL.String(),
Text: http.StatusText(builder.status),
Expand Down
53 changes: 0 additions & 53 deletions context.go

This file was deleted.

99 changes: 0 additions & 99 deletions example/main.go

This file was deleted.

59 changes: 24 additions & 35 deletions handler.go
Original file line number Diff line number Diff line change
@@ -1,57 +1,48 @@
package akumu

import (
"context"
"net/http"
)

type Handler func(*http.Request) error

func handleError(writer http.ResponseWriter, request *http.Request, err error, parent *Builder) {
if err == nil {
if parent != nil {
parent.Handle(writer, request)

return
}

Response(http.StatusOK).Handle(writer, request)
func handleResponder(writer http.ResponseWriter, request *http.Request, parent *Builder, responder Responder) {
if parent != nil {
parent.
Merge(responder.Respond(request)).
Handle(writer, request)

return
}

if builder, ok := err.(Builder); ok {
if parent != nil {
parent.
Merge(builder).
Handle(writer, request)

return
}
responder.
Respond(request).
Handle(writer, request)
}

builder.Handle(writer, request)
func handleNoError(writer http.ResponseWriter, request *http.Request, parent *Builder) {
if parent != nil {
parent.Handle(writer, request)

return
}

if responder, ok := err.(Responder); ok {
if parent != nil {
parent.
Merge(responder.Respond(request)).
Handle(writer, request)

return
}
Response(http.StatusOK).Handle(writer, request)
}

responder.
Respond(request).
Handle(writer, request)
func handle(writer http.ResponseWriter, request *http.Request, err error, parent *Builder) {
if err == nil {
handleNoError(writer, request, parent)
return
}

if responder, ok := err.(Responder); ok {
handleResponder(writer, request, parent, responder)
return
}

if parent != nil {
builder := NewProblemFromError(err, parent.status).
builder := NewProblem(err, parent.status).
Respond(request)

parent.
Expand All @@ -61,15 +52,13 @@ func handleError(writer http.ResponseWriter, request *http.Request, err error, p
return
}

NewProblemFromError(err, http.StatusInternalServerError).
NewProblem(err, http.StatusInternalServerError).
Respond(request).
Handle(writer, request)
}

func (handler Handler) ServeHTTP(writer http.ResponseWriter, request *http.Request) {
ctx := context.WithValue(request.Context(), ContextKey{}, NewContext())

handleError(writer, request, handler(request.WithContext(ctx)), nil)
handle(writer, request, handler(request), nil)
}

func (handler Handler) HandlerFunc() http.HandlerFunc {
Expand Down
6 changes: 3 additions & 3 deletions helpers.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,13 @@ package akumu

import (
"encoding/json"
"io"
"net/http"
)

func JSON[T any](reader io.Reader) (T, error) {
func JSON[T any](request *http.Request) (T, error) {
result := *new(T)

decoder := json.NewDecoder(reader)
decoder := json.NewDecoder(request.Body)
decoder.DisallowUnknownFields()

if err := decoder.Decode(&result); err != nil {
Expand Down
Loading

0 comments on commit 4caac61

Please sign in to comment.