Initial registration and call mocup
This commit is contained in:
parent
2b5618714c
commit
992cfd4220
57
server.go
57
server.go
|
@ -1,6 +1,10 @@
|
||||||
package srpc
|
package srpc
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"bytes"
|
||||||
|
"fmt"
|
||||||
|
"olznet.de/ssob"
|
||||||
|
"reflect"
|
||||||
"sync"
|
"sync"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -26,6 +30,13 @@ type responseHeader struct {
|
||||||
status responseStatus
|
status responseStatus
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type parseInputsFunc func(in []byte) (ret []reflect.Value)
|
||||||
|
|
||||||
|
type service struct {
|
||||||
|
f reflect.Value
|
||||||
|
fin parseInputsFunc
|
||||||
|
}
|
||||||
|
|
||||||
type Server struct {
|
type Server struct {
|
||||||
serviceMap sync.Map
|
serviceMap sync.Map
|
||||||
}
|
}
|
||||||
|
@ -35,3 +46,49 @@ func NewServer() *Server {
|
||||||
}
|
}
|
||||||
|
|
||||||
var DefaultServer = NewServer()
|
var DefaultServer = NewServer()
|
||||||
|
|
||||||
|
func (server *Server) RegisterName(name string, rcvr interface{}) (err error) {
|
||||||
|
ft := reflect.TypeOf(rcvr)
|
||||||
|
fv := reflect.ValueOf(rcvr)
|
||||||
|
|
||||||
|
nIn := ft.NumIn()
|
||||||
|
//nOut := ft.NumOut()
|
||||||
|
|
||||||
|
fs := service{}
|
||||||
|
|
||||||
|
f := func(in []byte) (ret []reflect.Value) {
|
||||||
|
var b bytes.Buffer
|
||||||
|
if _, err = b.Write(in); err != nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
decoder := ssob.NewDecoder(&b)
|
||||||
|
|
||||||
|
ret = make([]reflect.Value, nIn)
|
||||||
|
for i := 0; i < nIn; i++ {
|
||||||
|
in := reflect.New(ft.In(i))
|
||||||
|
if err = decoder.Decode(in.Interface()); err != nil {
|
||||||
|
fmt.Println(err)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
ret[i] = reflect.Indirect(in)
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret
|
||||||
|
}
|
||||||
|
|
||||||
|
fs.fin = f
|
||||||
|
fs.f = fv
|
||||||
|
server.serviceMap.Store(name, fs)
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (server *Server) CallName(name string, in []byte) {
|
||||||
|
fs, _ := server.serviceMap.Load(name)
|
||||||
|
|
||||||
|
fmt.Printf("3. ")
|
||||||
|
fmt.Println(in)
|
||||||
|
inputs := fs.(service).fin(in)
|
||||||
|
fmt.Println(inputs)
|
||||||
|
fs.(service).f.Call(inputs)
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue