Skip to content

Commit

Permalink
capnpc-go: allow nil params in client wrappers
Browse files Browse the repository at this point in the history
Fixes #9
  • Loading branch information
zombiezen committed Oct 11, 2015
1 parent d71890f commit 2d62635
Show file tree
Hide file tree
Showing 9 changed files with 105 additions and 77 deletions.
11 changes: 7 additions & 4 deletions capnpc-go/templates.go
Original file line number Diff line number Diff line change
Expand Up @@ -415,15 +415,18 @@ func (c {{$.Node.Name}}) {{.Name|title}}(ctx {{context}}.Context, params func({{
if c.Client == nil {
return {{.Results.RemoteName $.Node}}_Promise{Pipeline: {{capnp}}.NewPipeline({{capnp}}.ErrorAnswer({{capnp}}.ErrNullClient))}
}
return {{.Results.RemoteName $.Node}}_Promise{Pipeline: {{capnp}}.NewPipeline(c.Client.Call(&{{capnp}}.Call{
call := &{{capnp}}.Call{
Ctx: ctx,
Method: {{capnp}}.Method{
{{template "_interfaceMethod" .}}
},
ParamsSize: {{.Params.ObjectSize}},
ParamsFunc: func(s {{capnp}}.Struct) error { return params({{.Params.RemoteName $.Node}}{Struct: s}) },
Options: {{capnp}}.NewCallOptions(opts),
}))}
}
if params != nil {
call.ParamsSize = {{.Params.ObjectSize}}
call.ParamsFunc = func(s {{capnp}}.Struct) error { return params({{.Params.RemoteName $.Node}}{Struct: s}) }
}
return {{.Results.RemoteName $.Node}}_Promise{Pipeline: {{capnp}}.NewPipeline(c.Client.Call(call))}
}
{{end}}
{{end}}
Expand Down
26 changes: 16 additions & 10 deletions internal/aircraftlib/aircraft.capnp.go
Original file line number Diff line number Diff line change
Expand Up @@ -3923,7 +3923,7 @@ func (c Echo) Echo(ctx context.Context, params func(Echo_echo_Params) error, opt
if c.Client == nil {
return Echo_echo_Results_Promise{Pipeline: capnp.NewPipeline(capnp.ErrorAnswer(capnp.ErrNullClient))}
}
return Echo_echo_Results_Promise{Pipeline: capnp.NewPipeline(c.Client.Call(&capnp.Call{
call := &capnp.Call{
Ctx: ctx,
Method: capnp.Method{

Expand All @@ -3932,10 +3932,13 @@ func (c Echo) Echo(ctx context.Context, params func(Echo_echo_Params) error, opt
InterfaceName: "aircraft.capnp:Echo",
MethodName: "echo",
},
ParamsSize: capnp.ObjectSize{DataSize: 0, PointerCount: 1},
ParamsFunc: func(s capnp.Struct) error { return params(Echo_echo_Params{Struct: s}) },
Options: capnp.NewCallOptions(opts),
}))}
Options: capnp.NewCallOptions(opts),
}
if params != nil {
call.ParamsSize = capnp.ObjectSize{DataSize: 0, PointerCount: 1}
call.ParamsFunc = func(s capnp.Struct) error { return params(Echo_echo_Params{Struct: s}) }
}
return Echo_echo_Results_Promise{Pipeline: capnp.NewPipeline(c.Client.Call(call))}
}

type Echo_Server interface {
Expand Down Expand Up @@ -4552,7 +4555,7 @@ func (c CallSequence) GetNumber(ctx context.Context, params func(CallSequence_ge
if c.Client == nil {
return CallSequence_getNumber_Results_Promise{Pipeline: capnp.NewPipeline(capnp.ErrorAnswer(capnp.ErrNullClient))}
}
return CallSequence_getNumber_Results_Promise{Pipeline: capnp.NewPipeline(c.Client.Call(&capnp.Call{
call := &capnp.Call{
Ctx: ctx,
Method: capnp.Method{

Expand All @@ -4561,10 +4564,13 @@ func (c CallSequence) GetNumber(ctx context.Context, params func(CallSequence_ge
InterfaceName: "aircraft.capnp:CallSequence",
MethodName: "getNumber",
},
ParamsSize: capnp.ObjectSize{DataSize: 0, PointerCount: 0},
ParamsFunc: func(s capnp.Struct) error { return params(CallSequence_getNumber_Params{Struct: s}) },
Options: capnp.NewCallOptions(opts),
}))}
Options: capnp.NewCallOptions(opts),
}
if params != nil {
call.ParamsSize = capnp.ObjectSize{DataSize: 0, PointerCount: 0}
call.ParamsFunc = func(s capnp.Struct) error { return params(CallSequence_getNumber_Params{Struct: s}) }
}
return CallSequence_getNumber_Results_Promise{Pipeline: capnp.NewPipeline(c.Client.Call(call))}
}

type CallSequence_Server interface {
Expand Down
8 changes: 2 additions & 6 deletions internal/demo/hash_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -62,9 +62,7 @@ func client(ctx context.Context, c net.Conn) error {
hf := hashes.HashFactory{Client: conn.Bootstrap(ctx)}

// Now we can call methods on hf, and they will be sent over c.
s := hf.NewSha1(ctx, func(p hashes.HashFactory_newSha1_Params) error {
return nil
}).Hash()
s := hf.NewSha1(ctx, nil).Hash()
// s refers to a remote Hash. Method calls are delivered in order.
s.Write(ctx, func(p hashes.Hash_write_Params) error {
err := p.SetData([]byte("Hello, "))
Expand All @@ -74,9 +72,7 @@ func client(ctx context.Context, c net.Conn) error {
err := p.SetData([]byte("World!"))
return err
})
result, err := s.Sum(ctx, func(p hashes.Hash_sum_Params) error {
return nil
}).Struct()
result, err := s.Sum(ctx, nil).Struct()
if err != nil {
return err
}
Expand Down
39 changes: 24 additions & 15 deletions internal/demo/hashes/hash.capnp.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ func (c HashFactory) NewSha1(ctx context.Context, params func(HashFactory_newSha
if c.Client == nil {
return HashFactory_newSha1_Results_Promise{Pipeline: capnp.NewPipeline(capnp.ErrorAnswer(capnp.ErrNullClient))}
}
return HashFactory_newSha1_Results_Promise{Pipeline: capnp.NewPipeline(c.Client.Call(&capnp.Call{
call := &capnp.Call{
Ctx: ctx,
Method: capnp.Method{

Expand All @@ -23,10 +23,13 @@ func (c HashFactory) NewSha1(ctx context.Context, params func(HashFactory_newSha
InterfaceName: "hash.capnp:HashFactory",
MethodName: "newSha1",
},
ParamsSize: capnp.ObjectSize{DataSize: 0, PointerCount: 0},
ParamsFunc: func(s capnp.Struct) error { return params(HashFactory_newSha1_Params{Struct: s}) },
Options: capnp.NewCallOptions(opts),
}))}
Options: capnp.NewCallOptions(opts),
}
if params != nil {
call.ParamsSize = capnp.ObjectSize{DataSize: 0, PointerCount: 0}
call.ParamsFunc = func(s capnp.Struct) error { return params(HashFactory_newSha1_Params{Struct: s}) }
}
return HashFactory_newSha1_Results_Promise{Pipeline: capnp.NewPipeline(c.Client.Call(call))}
}

type HashFactory_Server interface {
Expand Down Expand Up @@ -208,7 +211,7 @@ func (c Hash) Write(ctx context.Context, params func(Hash_write_Params) error, o
if c.Client == nil {
return Hash_write_Results_Promise{Pipeline: capnp.NewPipeline(capnp.ErrorAnswer(capnp.ErrNullClient))}
}
return Hash_write_Results_Promise{Pipeline: capnp.NewPipeline(c.Client.Call(&capnp.Call{
call := &capnp.Call{
Ctx: ctx,
Method: capnp.Method{

Expand All @@ -217,17 +220,20 @@ func (c Hash) Write(ctx context.Context, params func(Hash_write_Params) error, o
InterfaceName: "hash.capnp:Hash",
MethodName: "write",
},
ParamsSize: capnp.ObjectSize{DataSize: 0, PointerCount: 1},
ParamsFunc: func(s capnp.Struct) error { return params(Hash_write_Params{Struct: s}) },
Options: capnp.NewCallOptions(opts),
}))}
Options: capnp.NewCallOptions(opts),
}
if params != nil {
call.ParamsSize = capnp.ObjectSize{DataSize: 0, PointerCount: 1}
call.ParamsFunc = func(s capnp.Struct) error { return params(Hash_write_Params{Struct: s}) }
}
return Hash_write_Results_Promise{Pipeline: capnp.NewPipeline(c.Client.Call(call))}
}

func (c Hash) Sum(ctx context.Context, params func(Hash_sum_Params) error, opts ...capnp.CallOption) Hash_sum_Results_Promise {
if c.Client == nil {
return Hash_sum_Results_Promise{Pipeline: capnp.NewPipeline(capnp.ErrorAnswer(capnp.ErrNullClient))}
}
return Hash_sum_Results_Promise{Pipeline: capnp.NewPipeline(c.Client.Call(&capnp.Call{
call := &capnp.Call{
Ctx: ctx,
Method: capnp.Method{

Expand All @@ -236,10 +242,13 @@ func (c Hash) Sum(ctx context.Context, params func(Hash_sum_Params) error, opts
InterfaceName: "hash.capnp:Hash",
MethodName: "sum",
},
ParamsSize: capnp.ObjectSize{DataSize: 0, PointerCount: 0},
ParamsFunc: func(s capnp.Struct) error { return params(Hash_sum_Params{Struct: s}) },
Options: capnp.NewCallOptions(opts),
}))}
Options: capnp.NewCallOptions(opts),
}
if params != nil {
call.ParamsSize = capnp.ObjectSize{DataSize: 0, PointerCount: 0}
call.ParamsFunc = func(s capnp.Struct) error { return params(Hash_sum_Params{Struct: s}) }
}
return Hash_sum_Results_Promise{Pipeline: capnp.NewPipeline(c.Client.Call(call))}
}

type Hash_Server interface {
Expand Down
2 changes: 1 addition & 1 deletion rpc/cancel_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ func TestCancel(t *testing.T) {
client := testcapnp.Hanger{Client: c.Bootstrap(ctx)}

subctx, subcancel := context.WithCancel(ctx)
promise := client.Hang(subctx, func(r testcapnp.Hanger_hang_Params) error { return nil })
promise := client.Hang(subctx, nil)
<-notify
subcancel()
_, err := promise.Struct()
Expand Down
78 changes: 48 additions & 30 deletions rpc/internal/testcapnp/test.capnp.go
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ func (c HandleFactory) NewHandle(ctx context.Context, params func(HandleFactory_
if c.Client == nil {
return HandleFactory_newHandle_Results_Promise{Pipeline: capnp.NewPipeline(capnp.ErrorAnswer(capnp.ErrNullClient))}
}
return HandleFactory_newHandle_Results_Promise{Pipeline: capnp.NewPipeline(c.Client.Call(&capnp.Call{
call := &capnp.Call{
Ctx: ctx,
Method: capnp.Method{

Expand All @@ -41,10 +41,13 @@ func (c HandleFactory) NewHandle(ctx context.Context, params func(HandleFactory_
InterfaceName: "test.capnp:HandleFactory",
MethodName: "newHandle",
},
ParamsSize: capnp.ObjectSize{DataSize: 0, PointerCount: 0},
ParamsFunc: func(s capnp.Struct) error { return params(HandleFactory_newHandle_Params{Struct: s}) },
Options: capnp.NewCallOptions(opts),
}))}
Options: capnp.NewCallOptions(opts),
}
if params != nil {
call.ParamsSize = capnp.ObjectSize{DataSize: 0, PointerCount: 0}
call.ParamsFunc = func(s capnp.Struct) error { return params(HandleFactory_newHandle_Params{Struct: s}) }
}
return HandleFactory_newHandle_Results_Promise{Pipeline: capnp.NewPipeline(c.Client.Call(call))}
}

type HandleFactory_Server interface {
Expand Down Expand Up @@ -226,7 +229,7 @@ func (c Hanger) Hang(ctx context.Context, params func(Hanger_hang_Params) error,
if c.Client == nil {
return Hanger_hang_Results_Promise{Pipeline: capnp.NewPipeline(capnp.ErrorAnswer(capnp.ErrNullClient))}
}
return Hanger_hang_Results_Promise{Pipeline: capnp.NewPipeline(c.Client.Call(&capnp.Call{
call := &capnp.Call{
Ctx: ctx,
Method: capnp.Method{

Expand All @@ -235,10 +238,13 @@ func (c Hanger) Hang(ctx context.Context, params func(Hanger_hang_Params) error,
InterfaceName: "test.capnp:Hanger",
MethodName: "hang",
},
ParamsSize: capnp.ObjectSize{DataSize: 0, PointerCount: 0},
ParamsFunc: func(s capnp.Struct) error { return params(Hanger_hang_Params{Struct: s}) },
Options: capnp.NewCallOptions(opts),
}))}
Options: capnp.NewCallOptions(opts),
}
if params != nil {
call.ParamsSize = capnp.ObjectSize{DataSize: 0, PointerCount: 0}
call.ParamsFunc = func(s capnp.Struct) error { return params(Hanger_hang_Params{Struct: s}) }
}
return Hanger_hang_Results_Promise{Pipeline: capnp.NewPipeline(c.Client.Call(call))}
}

type Hanger_Server interface {
Expand Down Expand Up @@ -395,7 +401,7 @@ func (c CallOrder) GetCallSequence(ctx context.Context, params func(CallOrder_ge
if c.Client == nil {
return CallOrder_getCallSequence_Results_Promise{Pipeline: capnp.NewPipeline(capnp.ErrorAnswer(capnp.ErrNullClient))}
}
return CallOrder_getCallSequence_Results_Promise{Pipeline: capnp.NewPipeline(c.Client.Call(&capnp.Call{
call := &capnp.Call{
Ctx: ctx,
Method: capnp.Method{

Expand All @@ -404,10 +410,13 @@ func (c CallOrder) GetCallSequence(ctx context.Context, params func(CallOrder_ge
InterfaceName: "test.capnp:CallOrder",
MethodName: "getCallSequence",
},
ParamsSize: capnp.ObjectSize{DataSize: 8, PointerCount: 0},
ParamsFunc: func(s capnp.Struct) error { return params(CallOrder_getCallSequence_Params{Struct: s}) },
Options: capnp.NewCallOptions(opts),
}))}
Options: capnp.NewCallOptions(opts),
}
if params != nil {
call.ParamsSize = capnp.ObjectSize{DataSize: 8, PointerCount: 0}
call.ParamsFunc = func(s capnp.Struct) error { return params(CallOrder_getCallSequence_Params{Struct: s}) }
}
return CallOrder_getCallSequence_Results_Promise{Pipeline: capnp.NewPipeline(c.Client.Call(call))}
}

type CallOrder_Server interface {
Expand Down Expand Up @@ -582,7 +591,7 @@ func (c Echoer) Echo(ctx context.Context, params func(Echoer_echo_Params) error,
if c.Client == nil {
return Echoer_echo_Results_Promise{Pipeline: capnp.NewPipeline(capnp.ErrorAnswer(capnp.ErrNullClient))}
}
return Echoer_echo_Results_Promise{Pipeline: capnp.NewPipeline(c.Client.Call(&capnp.Call{
call := &capnp.Call{
Ctx: ctx,
Method: capnp.Method{

Expand All @@ -591,17 +600,20 @@ func (c Echoer) Echo(ctx context.Context, params func(Echoer_echo_Params) error,
InterfaceName: "test.capnp:Echoer",
MethodName: "echo",
},
ParamsSize: capnp.ObjectSize{DataSize: 0, PointerCount: 1},
ParamsFunc: func(s capnp.Struct) error { return params(Echoer_echo_Params{Struct: s}) },
Options: capnp.NewCallOptions(opts),
}))}
Options: capnp.NewCallOptions(opts),
}
if params != nil {
call.ParamsSize = capnp.ObjectSize{DataSize: 0, PointerCount: 1}
call.ParamsFunc = func(s capnp.Struct) error { return params(Echoer_echo_Params{Struct: s}) }
}
return Echoer_echo_Results_Promise{Pipeline: capnp.NewPipeline(c.Client.Call(call))}
}

func (c Echoer) GetCallSequence(ctx context.Context, params func(CallOrder_getCallSequence_Params) error, opts ...capnp.CallOption) CallOrder_getCallSequence_Results_Promise {
if c.Client == nil {
return CallOrder_getCallSequence_Results_Promise{Pipeline: capnp.NewPipeline(capnp.ErrorAnswer(capnp.ErrNullClient))}
}
return CallOrder_getCallSequence_Results_Promise{Pipeline: capnp.NewPipeline(c.Client.Call(&capnp.Call{
call := &capnp.Call{
Ctx: ctx,
Method: capnp.Method{

Expand All @@ -610,10 +622,13 @@ func (c Echoer) GetCallSequence(ctx context.Context, params func(CallOrder_getCa
InterfaceName: "test.capnp:CallOrder",
MethodName: "getCallSequence",
},
ParamsSize: capnp.ObjectSize{DataSize: 8, PointerCount: 0},
ParamsFunc: func(s capnp.Struct) error { return params(CallOrder_getCallSequence_Params{Struct: s}) },
Options: capnp.NewCallOptions(opts),
}))}
Options: capnp.NewCallOptions(opts),
}
if params != nil {
call.ParamsSize = capnp.ObjectSize{DataSize: 8, PointerCount: 0}
call.ParamsFunc = func(s capnp.Struct) error { return params(CallOrder_getCallSequence_Params{Struct: s}) }
}
return CallOrder_getCallSequence_Results_Promise{Pipeline: capnp.NewPipeline(c.Client.Call(call))}
}

type Echoer_Server interface {
Expand Down Expand Up @@ -837,7 +852,7 @@ func (c Adder) Add(ctx context.Context, params func(Adder_add_Params) error, opt
if c.Client == nil {
return Adder_add_Results_Promise{Pipeline: capnp.NewPipeline(capnp.ErrorAnswer(capnp.ErrNullClient))}
}
return Adder_add_Results_Promise{Pipeline: capnp.NewPipeline(c.Client.Call(&capnp.Call{
call := &capnp.Call{
Ctx: ctx,
Method: capnp.Method{

Expand All @@ -846,10 +861,13 @@ func (c Adder) Add(ctx context.Context, params func(Adder_add_Params) error, opt
InterfaceName: "test.capnp:Adder",
MethodName: "add",
},
ParamsSize: capnp.ObjectSize{DataSize: 8, PointerCount: 0},
ParamsFunc: func(s capnp.Struct) error { return params(Adder_add_Params{Struct: s}) },
Options: capnp.NewCallOptions(opts),
}))}
Options: capnp.NewCallOptions(opts),
}
if params != nil {
call.ParamsSize = capnp.ObjectSize{DataSize: 8, PointerCount: 0}
call.ParamsFunc = func(s capnp.Struct) error { return params(Adder_add_Params{Struct: s}) }
}
return Adder_add_Results_Promise{Pipeline: capnp.NewPipeline(c.Client.Call(call))}
}

type Adder_Server interface {
Expand Down
4 changes: 1 addition & 3 deletions rpc/issue3_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -40,9 +40,7 @@ type SideEffectEchoer struct {
}

func (*SideEffectEchoer) Echo(call testcapnp.Echoer_echo) error {
call.Params.Cap().GetCallSequence(call.Ctx, func(p testcapnp.CallOrder_getCallSequence_Params) error {
return nil
})
call.Params.Cap().GetCallSequence(call.Ctx, nil)
call.Results.SetCap(call.Params.Cap())
return nil
}
12 changes: 5 additions & 7 deletions rpc/release_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ func TestRelease(t *testing.T) {
defer d.Wait()
defer c.Close()
client := testcapnp.HandleFactory{Client: c.Bootstrap(ctx)}
r, err := client.NewHandle(ctx, func(r testcapnp.HandleFactory_newHandle_Params) error { return nil }).Struct()
r, err := client.NewHandle(ctx, nil).Struct()
if err != nil {
t.Fatal("NewHandle:", err)
}
Expand Down Expand Up @@ -58,12 +58,12 @@ func TestReleaseAlias(t *testing.T) {
defer d.Wait()
defer c.Close()
client := testcapnp.HandleFactory{Client: c.Bootstrap(ctx)}
r1, err := client.NewHandle(ctx, func(r testcapnp.HandleFactory_newHandle_Params) error { return nil }).Struct()
r1, err := client.NewHandle(ctx, nil).Struct()
if err != nil {
t.Fatal("NewHandle #1:", err)
}
handle1 := r1.Handle()
r2, err := client.NewHandle(ctx, func(r testcapnp.HandleFactory_newHandle_Params) error { return nil }).Struct()
r2, err := client.NewHandle(ctx, nil).Struct()
if err != nil {
t.Fatal("NewHandle #2:", err)
}
Expand Down Expand Up @@ -91,10 +91,8 @@ func TestReleaseAlias(t *testing.T) {
func flushConn(ctx context.Context, c *rpc.Conn) {
// discard result
c.Bootstrap(ctx).Call(&capnp.Call{
Ctx: ctx,
Method: capnp.Method{InterfaceID: 0xdeadbeef, MethodID: 42},
ParamsFunc: func(capnp.Struct) error { return nil },
ParamsSize: capnp.ObjectSize{},
Ctx: ctx,
Method: capnp.Method{InterfaceID: 0xdeadbeef, MethodID: 42},
}).Struct()
}

Expand Down
Loading

0 comments on commit 2d62635

Please sign in to comment.