Exemplo n.º 1
0
func (c *Conn) descriptorForClient(desc rpccapnp.CapDescriptor, client capnp.Client) error {
	client = extractRPCClient(client)
	if ic, ok := client.(*importClient); ok && isImportFromConn(ic, c) {
		desc.SetReceiverHosted(uint32(ic.id))
		return nil
	}
	if pc, ok := client.(*capnp.PipelineClient); ok {
		p := (*capnp.Pipeline)(pc)
		if q, ok := p.Answer().(*question); ok && isQuestionFromConn(q, c) {
			a, err := desc.NewReceiverAnswer()
			if err != nil {
				return err
			}
			a.SetQuestionId(uint32(q.id))
			err = transformToPromisedAnswer(desc.Segment(), a, p.Transform())
			if err != nil {
				return err
			}
			return nil
		}
	}
	id := c.exports.add(client)
	desc.SetSenderHosted(uint32(id))
	return nil
}