65 lines
1.4 KiB
Go
65 lines
1.4 KiB
Go
package transport
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
"git.wzray.com/homelab/hivemind/internal/transport/codec"
|
|
)
|
|
|
|
type route[In, Out any] struct {
|
|
path string
|
|
}
|
|
|
|
func NewRoute[In, Out any](path string) route[In, Out] {
|
|
return route[In, Out]{
|
|
path: path,
|
|
}
|
|
}
|
|
|
|
func routeToHandler[In, Out any](r route[In, Out], handler func(In) (Out, error)) Handler {
|
|
return Handler{
|
|
path: r.path,
|
|
handler: func(c codec.Codec, b []byte) ([]byte, error) {
|
|
data, err := codec.Decode[In](c, b)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("unable to decode body: %w", err)
|
|
}
|
|
|
|
out, err := handler(data)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("error while handling request: %w", err)
|
|
}
|
|
|
|
raw, err := codec.Encode(c, out)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("unable to encode body: %w", err)
|
|
}
|
|
|
|
return raw, nil
|
|
},
|
|
}
|
|
}
|
|
|
|
func (e route[In, Out]) Call(caller Caller, host string, data In) (Out, error) {
|
|
var out Out
|
|
err := caller.Call(host, e.path, data, &out)
|
|
return out, err
|
|
}
|
|
|
|
func (e route[In, Out]) CallNoInput(caller Caller, host string) (Out, error) {
|
|
var out Out
|
|
err := caller.Call(host, e.path, struct{}{}, &out)
|
|
return out, err
|
|
}
|
|
|
|
func (e route[In, Out]) CallNoOutput(caller Caller, host string, data In) error {
|
|
return caller.Call(host, e.path, data, nil)
|
|
}
|
|
|
|
func (e route[In, Out]) Path() string {
|
|
return e.path
|
|
}
|
|
|
|
func (e route[In, Out]) Register(r Registrator, h func(In) (Out, error)) {
|
|
r.Register(routeToHandler(e, h))
|
|
}
|