From 5117847740090c68383ff5eb4b146958bd853e49 Mon Sep 17 00:00:00 2001 From: mountain Date: Tue, 5 Sep 2023 11:56:53 +0900 Subject: [PATCH] =?UTF-8?q?MakeHttpApiReceiverByValue=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server.go | 43 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/server.go b/server.go index 2cef02e..c79e74e 100644 --- a/server.go +++ b/server.go @@ -613,6 +613,49 @@ type HttpApiReceiver struct { methods map[string]apiFuncType } +func MakeHttpApiReceiverByValue(receiver reflect.Value) HttpApiReceiver { + methods := make(map[string]apiFuncType) + + tp := receiver.Type() + name := tp.Elem().Name() + for i := 0; i < tp.NumMethod(); i++ { + method := tp.Method(i) + if method.Type.NumIn() != 3 { + continue + } + + if method.Type.In(0) != tp { + continue + } + + var w http.ResponseWriter + if method.Type.In(1) != reflect.TypeOf(w) { + continue + } + + var r http.Request + if method.Type.In(2) != reflect.TypeOf(&r) { + continue + } + + if method.Name == "ServeHTTP" { + continue + } + + funcptr := method.Func.Pointer() + p1 := unsafe.Pointer(&funcptr) + p2 := unsafe.Pointer(&p1) + testfunc := (*func(*T, http.ResponseWriter, *http.Request))(p2) + methods[name+"."+method.Name] = func(w http.ResponseWriter, r *http.Request) { + (*testfunc)(receiver.Interface(), w, r) + } + } + + return HttpApiReceiver{ + methods: methods, + } +} + func MakeHttpApiReceiver[T any](receiver *T) HttpApiReceiver { methods := make(map[string]apiFuncType)