good morning!!!!

Skip to content
Snippets Groups Projects
response.go 1.76 KiB
Newer Older
a's avatar
a committed
package jrpc

import (
	"encoding/json"
	"net/http"
a's avatar
a committed

	"gfx.cafe/open/jrpc/codec"
a's avatar
a committed
)

a's avatar
a committed
type Response struct {
a's avatar
a committed
	Version codec.Version    `json:"jsonrpc,omitempty"`
	ID      *codec.ID        `json:"id,omitempty"`
	Result  json.RawMessage  `json:"result,omitempty"`
	Error   *codec.JsonError `json:"error,omitempty"`
a's avatar
a committed
}

a's avatar
a committed
func (r *Response) Msg() *codec.Message {
	out := &codec.Message{}
a's avatar
a committed
	if r.ID != nil {
		out.ID = r.ID
a's avatar
a committed
	}
	if r.Error != nil {
		out.Error = r.Error
a's avatar
a committed
	} else {
		out.Result = r.Result
a's avatar
a committed
	}
	return out
}
a's avatar
a committed

a's avatar
a committed
type ResponseWriterMsg struct {
	r    *Request
	resp *Response
a's avatar
a committed
}

type options struct {
}

func NewReaderResponseWriterMsg(r *Request) *ResponseWriterMsg {
	rw := &ResponseWriterMsg{
		r: r,
a's avatar
a committed
		resp: &Response{
			ID: r.ID,
		},
a's avatar
a committed
	}
	return rw
}

func (w *ResponseWriterMsg) Header() http.Header {
a's avatar
a committed
	wh := w.r.Peer.HTTP.Headers
a's avatar
a committed
	if wh == nil {
		wh = http.Header{}
	}
a's avatar
a committed
	return wh
}

func (w *ResponseWriterMsg) Option(k string, v any) {
}

func (w *ResponseWriterMsg) Send(args any, e error) (err error) {
	if e != nil {
a's avatar
a committed
		if c, ok := e.(*codec.JsonError); ok {
a's avatar
a committed
			w.resp.Error = c
		} else {
a's avatar
a committed
			w.resp.Error = &codec.JsonError{
				Code:    codec.ErrorCodeApplication,
a's avatar
a committed
				Message: e.Error(),
			}
		}
a's avatar
a committed
		ec, ok := e.(codec.Error)
a's avatar
a committed
		if ok {
			w.resp.Error.Code = ec.ErrorCode()
		}
a's avatar
a committed
		de, ok := e.(codec.DataError)
a's avatar
a committed
		if ok {
			w.resp.Error.Data = de.ErrorData()
		}
a's avatar
a committed
		return nil
	}
a's avatar
a committed
	w.resp.Result, err = json.Marshal(args)
a's avatar
a committed
	if err != nil {
a's avatar
a committed
		w.resp.Error = &codec.JsonError{
a's avatar
a committed
			Code:    -32603,
			Message: err.Error(),
		}
		return nil
	}
a's avatar
a committed
	return nil
}

a's avatar
a committed
// TODO: implement
a's avatar
a committed
func (w *ResponseWriterMsg) Notify(args any) (err error) {
	return nil
}

a's avatar
a committed
func (w *ResponseWriterMsg) Response() *Response {
	return w.resp
}
a's avatar
a committed

func (w *ResponseWriterMsg) Msg() *codec.Message {
a's avatar
a committed
	return w.resp.Msg()
a's avatar
a committed
}