Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 14 additions & 1 deletion capnpc-go/capnpc-go.go
Original file line number Diff line number Diff line change
Expand Up @@ -744,7 +744,15 @@ func makeTypeRef(t schema.Type, rel *node, nodes nodeMap) (typeRef, error) {
ref.name = ref.name + "_List"
ref.newfunc = "New" + ref.name
return ref, nil
case schema.Type_Which_anyPointer, schema.Type_Which_list, schema.Type_Which_interface:
case schema.Type_Which_interface:
ref, err := nodeRef(lt.Interface().TypeId())
if err != nil {
return ref, err
}
ref.name = ref.name + "_List"
ref.newfunc = "New" + ref.name
return ref, nil
case schema.Type_Which_anyPointer, schema.Type_Which_list:
return typeRef{name: "PointerList", newfunc: "NewPointerList", imp: capnpImportSpec}, nil
}
case schema.Type_Which_anyPointer:
Expand Down Expand Up @@ -1095,6 +1103,11 @@ func (g *generator) defineInterface(n *node) error {
if err != nil {
return fmt.Errorf("interface server %s: %v", n, err)
}

err = g.r.Render(interfaceListParams{
G: g,
Node: n,
})
return nil
}

Expand Down
5 changes: 5 additions & 0 deletions capnpc-go/templateparams.go
Original file line number Diff line number Diff line change
Expand Up @@ -164,6 +164,11 @@ type promiseFieldInterfaceParams struct {
Interface *node
}

type interfaceListParams struct {
G *generator
Node *node
}

type interfaceClientParams struct {
G *generator
Node *node
Expand Down
9 changes: 9 additions & 0 deletions capnpc-go/templates/interfaceList
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@

// {{.Node.Name}}_List is a list of {{.Node.Name}}.
type {{.Node.Name}}_List = {{.G.Capnp}}.CapList[{{.Node.Name}}]

// New{{.Node.Name}} creates a new list of {{.Node.Name}}.
func New{{.Node.Name}}_List(s *{{.G.Capnp}}.Segment, sz int32) ({{.Node.Name}}_List, error) {
l, err := {{.G.Capnp}}.NewPointerList(s, sz)
return {{.G.Capnp}}.CapList[{{.Node.Name}}](l), err
}
41 changes: 34 additions & 7 deletions internal/aircraftlib/aircraft.capnp.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

17 changes: 17 additions & 0 deletions list.go
Original file line number Diff line number Diff line change
Expand Up @@ -1037,6 +1037,23 @@ func (s StructList[T]) String() string {
return buf.String()
}

type CapList[T ~struct{ Client *Client }] PointerList

func (c CapList[T]) At(i int) (T, error) {
ptr, err := PointerList(c).At(i)
if err != nil {
return T{}, err
}
return T{Client: ptr.Interface().Client()}, nil
}

func (c CapList[T]) Set(i int, v T) error {
pl := PointerList(c)
seg := pl.List.Segment()
capId := seg.Message().AddCap(struct{ Client *Client }(v).Client)
return pl.Set(i, NewInterface(seg, capId).ToPtr())
}

type listFlags uint8

const (
Expand Down
2 changes: 1 addition & 1 deletion pogs/pogs_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -1215,7 +1215,7 @@ func zfill(c air.Z, g *Z) error {
if !ee.Client.IsValid() {
continue
}
err := e.Set(i, capnp.NewInterface(e.Segment(), e.Message().AddCap(ee.Client)).ToPtr())
err := e.Set(i, ee)
if err != nil {
return err
}
Expand Down
27 changes: 27 additions & 0 deletions rpc/internal/testcapnp/test.capnp.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

9 changes: 9 additions & 0 deletions std/capnp/persistent/persistent.capnp.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.