blob: 54dd1367a678504f691b86a1197b9da5f3b0614c [file] [log] [blame]
package lib
import (
"veyron2/ipc"
"veyron2/vdl/vdlutil"
"veyron2/wiretype"
)
const (
// agreed-upon name of the signature method that's available on all services
signatureMethodName = "Signature"
)
var (
anydataType = wiretype.NamedPrimitiveType{
Name: "veyron2/vdlutil.AnyData",
Type: wiretype.TypeIDInterface,
}
errType = wiretype.NamedPrimitiveType{
Name: "error",
Type: wiretype.TypeIDInterface,
}
anydataTypeID = wiretype.TypeIDFirst
errTypeID = wiretype.TypeIDFirst
)
// JSONServiceSignature represents the information about a service signature that is used by JSON.
type JSONServiceSignature map[string]JSONMethodSignature
// JSONMethodSignature represents the information about a method signature that is used by JSON.
type JSONMethodSignature struct {
InArgs []string // InArgs is a list of argument names.
NumOutArgs int
IsStreaming bool
}
// NewJSONServiceSignature converts an ipc service signature to the format used by JSON.
func NewJSONServiceSignature(sig ipc.ServiceSignature) JSONServiceSignature {
jsig := JSONServiceSignature{}
for name, methSig := range sig.Methods {
jmethSig := JSONMethodSignature{
InArgs: make([]string, len(methSig.InArgs)),
NumOutArgs: len(methSig.OutArgs),
IsStreaming: methSig.InStream != wiretype.TypeIDInvalid || methSig.OutStream != wiretype.TypeIDInvalid,
}
for i, inarg := range methSig.InArgs {
jmethSig.InArgs[i] = inarg.Name
}
jsig[lowercaseFirstCharacter(name)] = jmethSig
}
return jsig
}
// ServiceSignature converts a JSONServiceSignature to an ipc service signature.
func (jss JSONServiceSignature) ServiceSignature() (ipc.ServiceSignature, error) {
ss := ipc.ServiceSignature{
Methods: make(map[string]ipc.MethodSignature),
}
for name, sig := range jss {
ms := ipc.MethodSignature{}
ms.InArgs = make([]ipc.MethodArgument, len(sig.InArgs))
for i, argName := range sig.InArgs {
ms.InArgs[i] = ipc.MethodArgument{
Name: argName,
Type: anydataTypeID,
}
}
ms.OutArgs = make([]ipc.MethodArgument, sig.NumOutArgs)
for i := 0; i < sig.NumOutArgs-1; i++ {
ms.OutArgs[i] = ipc.MethodArgument{
Type: anydataTypeID,
}
}
ms.OutArgs[sig.NumOutArgs-1] = ipc.MethodArgument{
Name: "err",
Type: errTypeID,
}
if sig.IsStreaming {
ms.InStream = anydataTypeID
ms.OutStream = anydataTypeID
}
ss.Methods[uppercaseFirstCharacter(name)] = ms
}
ss.TypeDefs = []vdlutil.Any{anydataType, errType}
return ss, nil
}