This commit is contained in:
Egor Aristov 2026-03-29 14:09:19 +03:00
parent 40bdc24422
commit ba80965416
4 changed files with 31 additions and 18 deletions

View File

@ -9,7 +9,7 @@ import (
"slices" "slices"
"time" "time"
kittenipc "github.com/egor3f/kitten-ipc" kittenipc "github.com/egor3f/kitten-ipc/lib/golang"
) )
// kittenipc:api // kittenipc:api

View File

@ -5,7 +5,8 @@ package main
import ( import (
"encoding/base64" "encoding/base64"
"fmt" "fmt"
kittenipc "github.com/egor3f/kitten-ipc"
kittenipc "github.com/egor3f/kitten-ipc/lib/golang"
) )
var _ = base64.StdEncoding var _ = base64.StdEncoding

View File

@ -113,20 +113,22 @@ func (p *GoApiParser) parseFile(sourceFile string) ([]api.Endpoint, error) {
apiMethod.Params = append(apiMethod.Params, *apiPar) apiMethod.Params = append(apiMethod.Params, *apiPar)
} }
for i, ret := range funcDecl.Type.Results.List { if funcDecl.Type.Results != nil {
apiRet, err := fieldToVal(ret, true) for i, ret := range funcDecl.Type.Results.List {
if err != nil { apiRet, err := fieldToVal(ret, true)
return nil, fmt.Errorf("parse return value %d for method %s: %w", i, apiMethod.Name, err) if err != nil {
} return nil, fmt.Errorf("parse return value %d for method %s: %w", i, apiMethod.Name, err)
if apiRet == nil { }
continue if apiRet == nil {
} continue
}
if len(ret.Names) > 0 { if len(ret.Names) > 0 {
apiRet.Name = ret.Names[0].Name apiRet.Name = ret.Names[0].Name
} }
apiMethod.Ret = append(apiMethod.Ret, *apiRet) apiMethod.Ret = append(apiMethod.Ret, *apiRet)
}
} }
endpoints[i].Methods = append(endpoints[i].Methods, apiMethod) endpoints[i].Methods = append(endpoints[i].Methods, apiMethod)
} }

View File

@ -129,9 +129,19 @@ func (ipc *ipcCommon) handleIncomingCall(msg Message) {
args = append(args, reflect.ValueOf(arg)) args = append(args, reflect.ValueOf(arg))
} }
var errorType = reflect.TypeOf((*error)(nil)).Elem()
allResultVals := method.Call(args) allResultVals := method.Call(args)
retResultVals := allResultVals[0 : len(allResultVals)-1] var retResultVals []reflect.Value
errResultVals := allResultVals[len(allResultVals)-1] var errResultVal reflect.Value
if len(allResultVals) > 0 {
if allResultVals[len(allResultVals)-1].Type().Implements(errorType) {
retResultVals = allResultVals[0 : len(allResultVals)-1]
errResultVal = allResultVals[len(allResultVals)-1]
} else {
retResultVals = allResultVals
}
}
var results []any var results []any
for _, resVal := range retResultVals { for _, resVal := range retResultVals {
@ -139,8 +149,8 @@ func (ipc *ipcCommon) handleIncomingCall(msg Message) {
} }
var resultError error var resultError error
if !errResultVals.IsNil() { if errResultVal.IsValid() && !errResultVal.IsNil() {
resultError = errResultVals.Interface().(error) resultError = errResultVal.Interface().(error)
} }
ipc.sendResponse(msg.Id, results, resultError) ipc.sendResponse(msg.Id, results, resultError)