diff --git a/internal/server/rpc/errors.go b/internal/server/rpc/errors.go index 28e5850..5bf5f98 100644 --- a/internal/server/rpc/errors.go +++ b/internal/server/rpc/errors.go @@ -1,10 +1,5 @@ package rpc -import ( - "encoding/json" - "net/http" -) - const ( ErrParseError = -32700 ErrParseErrorS = "Parse error" @@ -24,16 +19,3 @@ const ( ErrContextVersion = -32010 ErrContextVersionS = "Invalid context version" ) - -func WriteRouterError(w http.ResponseWriter, status int, e *RPCError) error { - w.Header().Set("Content-Type", "application/json") - w.WriteHeader(status) - - data, err := json.Marshal(e) - if err != nil { - return err - } - - _, err = w.Write(data) - return err -} diff --git a/internal/server/rpc/writers.go b/internal/server/rpc/writers.go new file mode 100644 index 0000000..77fca76 --- /dev/null +++ b/internal/server/rpc/writers.go @@ -0,0 +1,33 @@ +package rpc + +import ( + "encoding/json" + "fmt" + "net/http" +) + +func write(w http.ResponseWriter, status int, msg any) error { + w.Header().Set("Content-Type", "application/json") + w.WriteHeader(status) + + switch m := msg.(type) { + case RPCError, *RPCError, + RPCResponse, *RPCResponse: + data, err := json.Marshal(m) + if err != nil { + return err + } + _, err = w.Write(data) + return err + default: + return fmt.Errorf("invalid RPC structure: %T", msg) + } +} + +func WriteRouterError(w http.ResponseWriter, status int, errm *RPCError) error { + return write(w, status, errm) +} + +func WriteResponse(w http.ResponseWriter, response *RPCResponse) error { + return write(w, http.StatusOK, response) +}