| 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 |
| } |