diff --git a/capability.go b/capability.go index cdc39146..4831324c 100644 --- a/capability.go +++ b/capability.go @@ -21,6 +21,15 @@ type Interface struct { cap CapabilityID } +// i.EncodeAsPtr is equivalent to i.ToPtr(); for implementing TypeParam. +// The segment argument is ignored. +func (i Interface) EncodeAsPtr(*Segment) Ptr { return i.ToPtr() } + +// DecodeFromPtr(p) is equivalent to p.Interface(); for implementing TypeParam. +func (Interface) DecodeFromPtr(p Ptr) Interface { return p.Interface() } + +var _ TypeParam[Interface] = Interface{} + // NewInterface creates a new interface pointer. // // No allocation is performed in the given segment: it is used purely @@ -572,6 +581,18 @@ func (c Client) Release() { h.Shutdown() } +func (c Client) EncodeAsPtr(seg *Segment) Ptr { + capId := seg.Message().AddCap(c) + return NewInterface(seg, capId).ToPtr() +} + +func (Client) DecodeFromPtr(p Ptr) Client { + return p.Interface().Client() +} + +var _ TypeParam[Client] = Client{} + + // isResolve reports whether ch has been resolved. // The caller must be holding onto ch.mu. func (ch *clientHook) isResolved() bool { diff --git a/capnpc-go/templates/baseStructFuncs b/capnpc-go/templates/baseStructFuncs index a4f23ec2..edc0dbd1 100644 --- a/capnpc-go/templates/baseStructFuncs +++ b/capnpc-go/templates/baseStructFuncs @@ -21,3 +21,6 @@ func (s {{.Node.Name}}) String() string { } {{end}} +func ({{.Node.Name}}) DecodeFromPtr(p {{.G.Capnp}}.Ptr) {{.Node.Name}} { + return {{.Node.Name}}{ Struct: {{.G.Capnp}}.Struct{}.DecodeFromPtr(p) } +} diff --git a/capnpc-go/templates/interfaceClient b/capnpc-go/templates/interfaceClient index 60e5d11f..14ef4072 100644 --- a/capnpc-go/templates/interfaceClient +++ b/capnpc-go/templates/interfaceClient @@ -26,3 +26,7 @@ func (c {{$.Node.Name}}) AddRef() {{$.Node.Name}} { Client: c.Client.AddRef(), } } + +func ({{$.Node.Name}}) DecodeFromPtr(p {{.G.Capnp}}.Ptr) {{$.Node.Name}} { + return {{$.Node.Name}}{ Client: {{.G.Capnp}}.Client{}.DecodeFromPtr(p) } +} diff --git a/internal/aircraftlib/aircraft.capnp.go b/internal/aircraftlib/aircraft.capnp.go index 5b8d0c53..6ce45ee8 100644 --- a/internal/aircraftlib/aircraft.capnp.go +++ b/internal/aircraftlib/aircraft.capnp.go @@ -48,6 +48,9 @@ func (s Zdate) String() string { return str } +func (Zdate) DecodeFromPtr(p capnp.Ptr) Zdate { + return Zdate{Struct: capnp.Struct{}.DecodeFromPtr(p)} +} func (s Zdate) Year() int16 { return int16(s.Struct.Uint16(0)) } @@ -114,6 +117,9 @@ func (s Zdata) String() string { return str } +func (Zdata) DecodeFromPtr(p capnp.Ptr) Zdata { + return Zdata{Struct: capnp.Struct{}.DecodeFromPtr(p)} +} func (s Zdata) Data() ([]byte, error) { p, err := s.Struct.Ptr(0) return []byte(p.Data()), err @@ -238,6 +244,9 @@ func (s PlaneBase) String() string { return str } +func (PlaneBase) DecodeFromPtr(p capnp.Ptr) PlaneBase { + return PlaneBase{Struct: capnp.Struct{}.DecodeFromPtr(p)} +} func (s PlaneBase) Name() (string, error) { p, err := s.Struct.Ptr(0) return p.Text(), err @@ -354,6 +363,9 @@ func (s B737) String() string { return str } +func (B737) DecodeFromPtr(p capnp.Ptr) B737 { + return B737{Struct: capnp.Struct{}.DecodeFromPtr(p)} +} func (s B737) Base() (PlaneBase, error) { p, err := s.Struct.Ptr(0) return PlaneBase{Struct: p.Struct()}, err @@ -424,6 +436,9 @@ func (s A320) String() string { return str } +func (A320) DecodeFromPtr(p capnp.Ptr) A320 { + return A320{Struct: capnp.Struct{}.DecodeFromPtr(p)} +} func (s A320) Base() (PlaneBase, error) { p, err := s.Struct.Ptr(0) return PlaneBase{Struct: p.Struct()}, err @@ -494,6 +509,9 @@ func (s F16) String() string { return str } +func (F16) DecodeFromPtr(p capnp.Ptr) F16 { + return F16{Struct: capnp.Struct{}.DecodeFromPtr(p)} +} func (s F16) Base() (PlaneBase, error) { p, err := s.Struct.Ptr(0) return PlaneBase{Struct: p.Struct()}, err @@ -564,6 +582,9 @@ func (s Regression) String() string { return str } +func (Regression) DecodeFromPtr(p capnp.Ptr) Regression { + return Regression{Struct: capnp.Struct{}.DecodeFromPtr(p)} +} func (s Regression) Base() (PlaneBase, error) { p, err := s.Struct.Ptr(0) return PlaneBase{Struct: p.Struct()}, err @@ -730,6 +751,10 @@ func (s Aircraft) String() string { return str } +func (Aircraft) DecodeFromPtr(p capnp.Ptr) Aircraft { + return Aircraft{Struct: capnp.Struct{}.DecodeFromPtr(p)} +} + func (s Aircraft) Which() Aircraft_Which { return Aircraft_Which(s.Struct.Uint16(0)) } @@ -1048,6 +1073,10 @@ func (s Z) String() string { return str } +func (Z) DecodeFromPtr(p capnp.Ptr) Z { + return Z{Struct: capnp.Struct{}.DecodeFromPtr(p)} +} + func (s Z) Which() Z_Which { return Z_Which(s.Struct.Uint16(0)) } @@ -2378,6 +2407,9 @@ func (s Counter) String() string { return str } +func (Counter) DecodeFromPtr(p capnp.Ptr) Counter { + return Counter{Struct: capnp.Struct{}.DecodeFromPtr(p)} +} func (s Counter) Size() int64 { return int64(s.Struct.Uint64(0)) } @@ -2494,6 +2526,9 @@ func (s Bag) String() string { return str } +func (Bag) DecodeFromPtr(p capnp.Ptr) Bag { + return Bag{Struct: capnp.Struct{}.DecodeFromPtr(p)} +} func (s Bag) Counter() (Counter, error) { p, err := s.Struct.Ptr(0) return Counter{Struct: p.Struct()}, err @@ -2564,6 +2599,9 @@ func (s Zserver) String() string { return str } +func (Zserver) DecodeFromPtr(p capnp.Ptr) Zserver { + return Zserver{Struct: capnp.Struct{}.DecodeFromPtr(p)} +} func (s Zserver) Waitingjobs() (Zjob_List, error) { p, err := s.Struct.Ptr(0) return Zjob_List{List: p.List()}, err @@ -2630,6 +2668,9 @@ func (s Zjob) String() string { return str } +func (Zjob) DecodeFromPtr(p capnp.Ptr) Zjob { + return Zjob{Struct: capnp.Struct{}.DecodeFromPtr(p)} +} func (s Zjob) Cmd() (string, error) { p, err := s.Struct.Ptr(0) return p.Text(), err @@ -2714,6 +2755,10 @@ func (s VerEmpty) String() string { return str } +func (VerEmpty) DecodeFromPtr(p capnp.Ptr) VerEmpty { + return VerEmpty{Struct: capnp.Struct{}.DecodeFromPtr(p)} +} + // VerEmpty_List is a list of VerEmpty. type VerEmpty_List = capnp.StructList[VerEmpty] @@ -2756,6 +2801,9 @@ func (s VerOneData) String() string { return str } +func (VerOneData) DecodeFromPtr(p capnp.Ptr) VerOneData { + return VerOneData{Struct: capnp.Struct{}.DecodeFromPtr(p)} +} func (s VerOneData) Val() int16 { return int16(s.Struct.Uint16(0)) } @@ -2806,6 +2854,9 @@ func (s VerTwoData) String() string { return str } +func (VerTwoData) DecodeFromPtr(p capnp.Ptr) VerTwoData { + return VerTwoData{Struct: capnp.Struct{}.DecodeFromPtr(p)} +} func (s VerTwoData) Val() int16 { return int16(s.Struct.Uint16(0)) } @@ -2864,6 +2915,9 @@ func (s VerOnePtr) String() string { return str } +func (VerOnePtr) DecodeFromPtr(p capnp.Ptr) VerOnePtr { + return VerOnePtr{Struct: capnp.Struct{}.DecodeFromPtr(p)} +} func (s VerOnePtr) Ptr() (VerOneData, error) { p, err := s.Struct.Ptr(0) return VerOneData{Struct: p.Struct()}, err @@ -2934,6 +2988,9 @@ func (s VerTwoPtr) String() string { return str } +func (VerTwoPtr) DecodeFromPtr(p capnp.Ptr) VerTwoPtr { + return VerTwoPtr{Struct: capnp.Struct{}.DecodeFromPtr(p)} +} func (s VerTwoPtr) Ptr1() (VerOneData, error) { p, err := s.Struct.Ptr(0) return VerOneData{Struct: p.Struct()}, err @@ -3032,6 +3089,9 @@ func (s VerTwoDataTwoPtr) String() string { return str } +func (VerTwoDataTwoPtr) DecodeFromPtr(p capnp.Ptr) VerTwoDataTwoPtr { + return VerTwoDataTwoPtr{Struct: capnp.Struct{}.DecodeFromPtr(p)} +} func (s VerTwoDataTwoPtr) Val() int16 { return int16(s.Struct.Uint16(0)) } @@ -3146,6 +3206,9 @@ func (s HoldsVerEmptyList) String() string { return str } +func (HoldsVerEmptyList) DecodeFromPtr(p capnp.Ptr) HoldsVerEmptyList { + return HoldsVerEmptyList{Struct: capnp.Struct{}.DecodeFromPtr(p)} +} func (s HoldsVerEmptyList) Mylist() (VerEmpty_List, error) { p, err := s.Struct.Ptr(0) return VerEmpty_List{List: p.List()}, err @@ -3212,6 +3275,9 @@ func (s HoldsVerOneDataList) String() string { return str } +func (HoldsVerOneDataList) DecodeFromPtr(p capnp.Ptr) HoldsVerOneDataList { + return HoldsVerOneDataList{Struct: capnp.Struct{}.DecodeFromPtr(p)} +} func (s HoldsVerOneDataList) Mylist() (VerOneData_List, error) { p, err := s.Struct.Ptr(0) return VerOneData_List{List: p.List()}, err @@ -3278,6 +3344,9 @@ func (s HoldsVerTwoDataList) String() string { return str } +func (HoldsVerTwoDataList) DecodeFromPtr(p capnp.Ptr) HoldsVerTwoDataList { + return HoldsVerTwoDataList{Struct: capnp.Struct{}.DecodeFromPtr(p)} +} func (s HoldsVerTwoDataList) Mylist() (VerTwoData_List, error) { p, err := s.Struct.Ptr(0) return VerTwoData_List{List: p.List()}, err @@ -3344,6 +3413,9 @@ func (s HoldsVerOnePtrList) String() string { return str } +func (HoldsVerOnePtrList) DecodeFromPtr(p capnp.Ptr) HoldsVerOnePtrList { + return HoldsVerOnePtrList{Struct: capnp.Struct{}.DecodeFromPtr(p)} +} func (s HoldsVerOnePtrList) Mylist() (VerOnePtr_List, error) { p, err := s.Struct.Ptr(0) return VerOnePtr_List{List: p.List()}, err @@ -3410,6 +3482,9 @@ func (s HoldsVerTwoPtrList) String() string { return str } +func (HoldsVerTwoPtrList) DecodeFromPtr(p capnp.Ptr) HoldsVerTwoPtrList { + return HoldsVerTwoPtrList{Struct: capnp.Struct{}.DecodeFromPtr(p)} +} func (s HoldsVerTwoPtrList) Mylist() (VerTwoPtr_List, error) { p, err := s.Struct.Ptr(0) return VerTwoPtr_List{List: p.List()}, err @@ -3476,6 +3551,9 @@ func (s HoldsVerTwoTwoList) String() string { return str } +func (HoldsVerTwoTwoList) DecodeFromPtr(p capnp.Ptr) HoldsVerTwoTwoList { + return HoldsVerTwoTwoList{Struct: capnp.Struct{}.DecodeFromPtr(p)} +} func (s HoldsVerTwoTwoList) Mylist() (VerTwoDataTwoPtr_List, error) { p, err := s.Struct.Ptr(0) return VerTwoDataTwoPtr_List{List: p.List()}, err @@ -3542,6 +3620,9 @@ func (s HoldsVerTwoTwoPlus) String() string { return str } +func (HoldsVerTwoTwoPlus) DecodeFromPtr(p capnp.Ptr) HoldsVerTwoTwoPlus { + return HoldsVerTwoTwoPlus{Struct: capnp.Struct{}.DecodeFromPtr(p)} +} func (s HoldsVerTwoTwoPlus) Mylist() (VerTwoTwoPlus_List, error) { p, err := s.Struct.Ptr(0) return VerTwoTwoPlus_List{List: p.List()}, err @@ -3608,6 +3689,9 @@ func (s VerTwoTwoPlus) String() string { return str } +func (VerTwoTwoPlus) DecodeFromPtr(p capnp.Ptr) VerTwoTwoPlus { + return VerTwoTwoPlus{Struct: capnp.Struct{}.DecodeFromPtr(p)} +} func (s VerTwoTwoPlus) Val() int16 { return int16(s.Struct.Uint16(0)) } @@ -3754,6 +3838,9 @@ func (s HoldsText) String() string { return str } +func (HoldsText) DecodeFromPtr(p capnp.Ptr) HoldsText { + return HoldsText{Struct: capnp.Struct{}.DecodeFromPtr(p)} +} func (s HoldsText) Txt() (string, error) { p, err := s.Struct.Ptr(0) return p.Text(), err @@ -3862,6 +3949,9 @@ func (s WrapEmpty) String() string { return str } +func (WrapEmpty) DecodeFromPtr(p capnp.Ptr) WrapEmpty { + return WrapEmpty{Struct: capnp.Struct{}.DecodeFromPtr(p)} +} func (s WrapEmpty) MightNotBeReallyEmpty() (VerEmpty, error) { p, err := s.Struct.Ptr(0) return VerEmpty{Struct: p.Struct()}, err @@ -3932,6 +4022,9 @@ func (s Wrap2x2) String() string { return str } +func (Wrap2x2) DecodeFromPtr(p capnp.Ptr) Wrap2x2 { + return Wrap2x2{Struct: capnp.Struct{}.DecodeFromPtr(p)} +} func (s Wrap2x2) MightNotBeReallyEmpty() (VerTwoDataTwoPtr, error) { p, err := s.Struct.Ptr(0) return VerTwoDataTwoPtr{Struct: p.Struct()}, err @@ -4002,6 +4095,9 @@ func (s Wrap2x2plus) String() string { return str } +func (Wrap2x2plus) DecodeFromPtr(p capnp.Ptr) Wrap2x2plus { + return Wrap2x2plus{Struct: capnp.Struct{}.DecodeFromPtr(p)} +} func (s Wrap2x2plus) MightNotBeReallyEmpty() (VerTwoTwoPlus, error) { p, err := s.Struct.Ptr(0) return VerTwoTwoPlus{Struct: p.Struct()}, err @@ -4090,6 +4186,10 @@ func (s VoidUnion) String() string { return str } +func (VoidUnion) DecodeFromPtr(p capnp.Ptr) VoidUnion { + return VoidUnion{Struct: capnp.Struct{}.DecodeFromPtr(p)} +} + func (s VoidUnion) Which() VoidUnion_Which { return VoidUnion_Which(s.Struct.Uint16(0)) } @@ -4145,6 +4245,9 @@ func (s Nester1Capn) String() string { return str } +func (Nester1Capn) DecodeFromPtr(p capnp.Ptr) Nester1Capn { + return Nester1Capn{Struct: capnp.Struct{}.DecodeFromPtr(p)} +} func (s Nester1Capn) Strs() (capnp.TextList, error) { p, err := s.Struct.Ptr(0) return capnp.TextList{List: p.List()}, err @@ -4211,6 +4314,9 @@ func (s RWTestCapn) String() string { return str } +func (RWTestCapn) DecodeFromPtr(p capnp.Ptr) RWTestCapn { + return RWTestCapn{Struct: capnp.Struct{}.DecodeFromPtr(p)} +} func (s RWTestCapn) NestMatrix() (capnp.PointerList, error) { p, err := s.Struct.Ptr(0) return capnp.PointerList{List: p.List()}, err @@ -4277,6 +4383,9 @@ func (s ListStructCapn) String() string { return str } +func (ListStructCapn) DecodeFromPtr(p capnp.Ptr) ListStructCapn { + return ListStructCapn{Struct: capnp.Struct{}.DecodeFromPtr(p)} +} func (s ListStructCapn) Vec() (Nester1Capn_List, error) { p, err := s.Struct.Ptr(0) return Nester1Capn_List{List: p.List()}, err @@ -4346,6 +4455,10 @@ func (c Echo) AddRef() Echo { } } +func (Echo) DecodeFromPtr(p capnp.Ptr) Echo { + return Echo{Client: capnp.Client{}.DecodeFromPtr(p)} +} + // A Echo_Server is a Echo with a local implementation. type Echo_Server interface { Echo(context.Context, Echo_echo) error @@ -4436,6 +4549,9 @@ func (s Echo_echo_Params) String() string { return str } +func (Echo_echo_Params) DecodeFromPtr(p capnp.Ptr) Echo_echo_Params { + return Echo_echo_Params{Struct: capnp.Struct{}.DecodeFromPtr(p)} +} func (s Echo_echo_Params) In() (string, error) { p, err := s.Struct.Ptr(0) return p.Text(), err @@ -4496,6 +4612,9 @@ func (s Echo_echo_Results) String() string { return str } +func (Echo_echo_Results) DecodeFromPtr(p capnp.Ptr) Echo_echo_Results { + return Echo_echo_Results{Struct: capnp.Struct{}.DecodeFromPtr(p)} +} func (s Echo_echo_Results) Out() (string, error) { p, err := s.Struct.Ptr(0) return p.Text(), err @@ -4556,6 +4675,9 @@ func (s Hoth) String() string { return str } +func (Hoth) DecodeFromPtr(p capnp.Ptr) Hoth { + return Hoth{Struct: capnp.Struct{}.DecodeFromPtr(p)} +} func (s Hoth) Base() (EchoBase, error) { p, err := s.Struct.Ptr(0) return EchoBase{Struct: p.Struct()}, err @@ -4626,6 +4748,9 @@ func (s EchoBase) String() string { return str } +func (EchoBase) DecodeFromPtr(p capnp.Ptr) EchoBase { + return EchoBase{Struct: capnp.Struct{}.DecodeFromPtr(p)} +} func (s EchoBase) Echo() Echo { p, _ := s.Struct.Ptr(0) return Echo{Client: p.Interface().Client()} @@ -4690,6 +4815,9 @@ func (s StackingRoot) String() string { return str } +func (StackingRoot) DecodeFromPtr(p capnp.Ptr) StackingRoot { + return StackingRoot{Struct: capnp.Struct{}.DecodeFromPtr(p)} +} func (s StackingRoot) A() (StackingA, error) { p, err := s.Struct.Ptr(1) return StackingA{Struct: p.Struct()}, err @@ -4792,6 +4920,9 @@ func (s StackingA) String() string { return str } +func (StackingA) DecodeFromPtr(p capnp.Ptr) StackingA { + return StackingA{Struct: capnp.Struct{}.DecodeFromPtr(p)} +} func (s StackingA) Num() int32 { return int32(s.Struct.Uint32(0)) } @@ -4870,6 +5001,9 @@ func (s StackingB) String() string { return str } +func (StackingB) DecodeFromPtr(p capnp.Ptr) StackingB { + return StackingB{Struct: capnp.Struct{}.DecodeFromPtr(p)} +} func (s StackingB) Num() int32 { return int32(s.Struct.Uint32(0)) } @@ -4923,6 +5057,10 @@ func (c CallSequence) AddRef() CallSequence { } } +func (CallSequence) DecodeFromPtr(p capnp.Ptr) CallSequence { + return CallSequence{Client: capnp.Client{}.DecodeFromPtr(p)} +} + // A CallSequence_Server is a CallSequence with a local implementation. type CallSequence_Server interface { GetNumber(context.Context, CallSequence_getNumber) error @@ -5013,6 +5151,10 @@ func (s CallSequence_getNumber_Params) String() string { return str } +func (CallSequence_getNumber_Params) DecodeFromPtr(p capnp.Ptr) CallSequence_getNumber_Params { + return CallSequence_getNumber_Params{Struct: capnp.Struct{}.DecodeFromPtr(p)} +} + // CallSequence_getNumber_Params_List is a list of CallSequence_getNumber_Params. type CallSequence_getNumber_Params_List = capnp.StructList[CallSequence_getNumber_Params] @@ -5055,6 +5197,9 @@ func (s CallSequence_getNumber_Results) String() string { return str } +func (CallSequence_getNumber_Results) DecodeFromPtr(p capnp.Ptr) CallSequence_getNumber_Results { + return CallSequence_getNumber_Results{Struct: capnp.Struct{}.DecodeFromPtr(p)} +} func (s CallSequence_getNumber_Results) N() uint32 { return s.Struct.Uint32(0) } @@ -5124,6 +5269,10 @@ func (c Pipeliner) AddRef() Pipeliner { } } +func (Pipeliner) DecodeFromPtr(p capnp.Ptr) Pipeliner { + return Pipeliner{Client: capnp.Client{}.DecodeFromPtr(p)} +} + // A Pipeliner_Server is a Pipeliner with a local implementation. type Pipeliner_Server interface { NewPipeliner(context.Context, Pipeliner_newPipeliner) error @@ -5228,6 +5377,10 @@ func (s Pipeliner_newPipeliner_Params) String() string { return str } +func (Pipeliner_newPipeliner_Params) DecodeFromPtr(p capnp.Ptr) Pipeliner_newPipeliner_Params { + return Pipeliner_newPipeliner_Params{Struct: capnp.Struct{}.DecodeFromPtr(p)} +} + // Pipeliner_newPipeliner_Params_List is a list of Pipeliner_newPipeliner_Params. type Pipeliner_newPipeliner_Params_List = capnp.StructList[Pipeliner_newPipeliner_Params] @@ -5270,6 +5423,9 @@ func (s Pipeliner_newPipeliner_Results) String() string { return str } +func (Pipeliner_newPipeliner_Results) DecodeFromPtr(p capnp.Ptr) Pipeliner_newPipeliner_Results { + return Pipeliner_newPipeliner_Results{Struct: capnp.Struct{}.DecodeFromPtr(p)} +} func (s Pipeliner_newPipeliner_Results) Extra() (capnp.Ptr, error) { return s.Struct.Ptr(0) } @@ -5350,6 +5506,9 @@ func (s Defaults) String() string { return str } +func (Defaults) DecodeFromPtr(p capnp.Ptr) Defaults { + return Defaults{Struct: capnp.Struct{}.DecodeFromPtr(p)} +} func (s Defaults) Text() (string, error) { p, err := s.Struct.Ptr(0) return p.TextDefault("foo"), err @@ -5450,6 +5609,9 @@ func (s BenchmarkA) String() string { return str } +func (BenchmarkA) DecodeFromPtr(p capnp.Ptr) BenchmarkA { + return BenchmarkA{Struct: capnp.Struct{}.DecodeFromPtr(p)} +} func (s BenchmarkA) Name() (string, error) { p, err := s.Struct.Ptr(0) return p.Text(), err @@ -5560,6 +5722,9 @@ func (s AllocBenchmark) String() string { return str } +func (AllocBenchmark) DecodeFromPtr(p capnp.Ptr) AllocBenchmark { + return AllocBenchmark{Struct: capnp.Struct{}.DecodeFromPtr(p)} +} func (s AllocBenchmark) Fields() (AllocBenchmark_Field_List, error) { p, err := s.Struct.Ptr(0) return AllocBenchmark_Field_List{List: p.List()}, err @@ -5626,6 +5791,9 @@ func (s AllocBenchmark_Field) String() string { return str } +func (AllocBenchmark_Field) DecodeFromPtr(p capnp.Ptr) AllocBenchmark_Field { + return AllocBenchmark_Field{Struct: capnp.Struct{}.DecodeFromPtr(p)} +} func (s AllocBenchmark_Field) StringValue() (string, error) { p, err := s.Struct.Ptr(0) return p.Text(), err diff --git a/internal/aircraftlib/aircraft_test.go b/internal/aircraftlib/aircraft_test.go new file mode 100644 index 00000000..7c2eb50f --- /dev/null +++ b/internal/aircraftlib/aircraft_test.go @@ -0,0 +1,17 @@ +package aircraftlib + +import ( + "capnproto.org/go/capnp/v3" +) + +var ( + // Make sure interface types satisfy TypeParam: + _ capnp.TypeParam[Echo] = Echo{} + + // ...and structs: + _ capnp.TypeParam[Zdate] = Zdate{} + + // ...and lists: + _ capnp.TypeParam[Echo_List] = Echo_List{} + _ capnp.TypeParam[Zdate_List] = Zdate_List{} +) diff --git a/internal/demo/books/books.capnp.go b/internal/demo/books/books.capnp.go index d980c5dc..b6a32edf 100644 --- a/internal/demo/books/books.capnp.go +++ b/internal/demo/books/books.capnp.go @@ -33,6 +33,9 @@ func (s Book) String() string { return str } +func (Book) DecodeFromPtr(p capnp.Ptr) Book { + return Book{Struct: capnp.Struct{}.DecodeFromPtr(p)} +} func (s Book) Title() (string, error) { p, err := s.Struct.Ptr(0) return p.Text(), err diff --git a/internal/schema/schema.capnp.go b/internal/schema/schema.capnp.go index 3d312cc6..26f72f99 100644 --- a/internal/schema/schema.capnp.go +++ b/internal/schema/schema.capnp.go @@ -68,6 +68,10 @@ func ReadRootNode(msg *capnp.Message) (Node, error) { return Node{root.Struct()}, err } +func (Node) DecodeFromPtr(p capnp.Ptr) Node { + return Node{Struct: capnp.Struct{}.DecodeFromPtr(p)} +} + func (s Node) Which() Node_Which { return Node_Which(s.Struct.Uint16(12)) } @@ -569,6 +573,9 @@ func ReadRootNode_Parameter(msg *capnp.Message) (Node_Parameter, error) { return Node_Parameter{root.Struct()}, err } +func (Node_Parameter) DecodeFromPtr(p capnp.Ptr) Node_Parameter { + return Node_Parameter{Struct: capnp.Struct{}.DecodeFromPtr(p)} +} func (s Node_Parameter) Name() (string, error) { p, err := s.Struct.Ptr(0) return p.Text(), err @@ -616,6 +623,9 @@ func ReadRootNode_NestedNode(msg *capnp.Message) (Node_NestedNode, error) { return Node_NestedNode{root.Struct()}, err } +func (Node_NestedNode) DecodeFromPtr(p capnp.Ptr) Node_NestedNode { + return Node_NestedNode{Struct: capnp.Struct{}.DecodeFromPtr(p)} +} func (s Node_NestedNode) Name() (string, error) { p, err := s.Struct.Ptr(0) return p.Text(), err @@ -671,6 +681,9 @@ func ReadRootNode_SourceInfo(msg *capnp.Message) (Node_SourceInfo, error) { return Node_SourceInfo{root.Struct()}, err } +func (Node_SourceInfo) DecodeFromPtr(p capnp.Ptr) Node_SourceInfo { + return Node_SourceInfo{Struct: capnp.Struct{}.DecodeFromPtr(p)} +} func (s Node_SourceInfo) Id() uint64 { return s.Struct.Uint64(0) } @@ -750,6 +763,9 @@ func ReadRootNode_SourceInfo_Member(msg *capnp.Message) (Node_SourceInfo_Member, return Node_SourceInfo_Member{root.Struct()}, err } +func (Node_SourceInfo_Member) DecodeFromPtr(p capnp.Ptr) Node_SourceInfo_Member { + return Node_SourceInfo_Member{Struct: capnp.Struct{}.DecodeFromPtr(p)} +} func (s Node_SourceInfo_Member) DocComment() (string, error) { p, err := s.Struct.Ptr(0) return p.Text(), err @@ -837,6 +853,10 @@ func ReadRootField(msg *capnp.Message) (Field, error) { return Field{root.Struct()}, err } +func (Field) DecodeFromPtr(p capnp.Ptr) Field { + return Field{Struct: capnp.Struct{}.DecodeFromPtr(p)} +} + func (s Field) Which() Field_Which { return Field_Which(s.Struct.Uint16(8)) } @@ -1033,6 +1053,9 @@ func ReadRootEnumerant(msg *capnp.Message) (Enumerant, error) { return Enumerant{root.Struct()}, err } +func (Enumerant) DecodeFromPtr(p capnp.Ptr) Enumerant { + return Enumerant{Struct: capnp.Struct{}.DecodeFromPtr(p)} +} func (s Enumerant) Name() (string, error) { p, err := s.Struct.Ptr(0) return p.Text(), err @@ -1112,6 +1135,9 @@ func ReadRootSuperclass(msg *capnp.Message) (Superclass, error) { return Superclass{root.Struct()}, err } +func (Superclass) DecodeFromPtr(p capnp.Ptr) Superclass { + return Superclass{Struct: capnp.Struct{}.DecodeFromPtr(p)} +} func (s Superclass) Id() uint64 { return s.Struct.Uint64(0) } @@ -1173,6 +1199,9 @@ func ReadRootMethod(msg *capnp.Message) (Method, error) { return Method{root.Struct()}, err } +func (Method) DecodeFromPtr(p capnp.Ptr) Method { + return Method{Struct: capnp.Struct{}.DecodeFromPtr(p)} +} func (s Method) Name() (string, error) { p, err := s.Struct.Ptr(0) return p.Text(), err @@ -1464,6 +1493,10 @@ func ReadRootType(msg *capnp.Message) (Type, error) { return Type{root.Struct()}, err } +func (Type) DecodeFromPtr(p capnp.Ptr) Type { + return Type{Struct: capnp.Struct{}.DecodeFromPtr(p)} +} + func (s Type) Which() Type_Which { return Type_Which(s.Struct.Uint16(0)) } @@ -1788,6 +1821,9 @@ func ReadRootBrand(msg *capnp.Message) (Brand, error) { return Brand{root.Struct()}, err } +func (Brand) DecodeFromPtr(p capnp.Ptr) Brand { + return Brand{Struct: capnp.Struct{}.DecodeFromPtr(p)} +} func (s Brand) Scopes() (Brand_Scope_List, error) { p, err := s.Struct.Ptr(0) return Brand_Scope_List{List: p.List()}, err @@ -1859,6 +1895,10 @@ func ReadRootBrand_Scope(msg *capnp.Message) (Brand_Scope, error) { return Brand_Scope{root.Struct()}, err } +func (Brand_Scope) DecodeFromPtr(p capnp.Ptr) Brand_Scope { + return Brand_Scope{Struct: capnp.Struct{}.DecodeFromPtr(p)} +} + func (s Brand_Scope) Which() Brand_Scope_Which { return Brand_Scope_Which(s.Struct.Uint16(8)) } @@ -1954,6 +1994,10 @@ func ReadRootBrand_Binding(msg *capnp.Message) (Brand_Binding, error) { return Brand_Binding{root.Struct()}, err } +func (Brand_Binding) DecodeFromPtr(p capnp.Ptr) Brand_Binding { + return Brand_Binding{Struct: capnp.Struct{}.DecodeFromPtr(p)} +} + func (s Brand_Binding) Which() Brand_Binding_Which { return Brand_Binding_Which(s.Struct.Uint16(0)) } @@ -2092,6 +2136,10 @@ func ReadRootValue(msg *capnp.Message) (Value, error) { return Value{root.Struct()}, err } +func (Value) DecodeFromPtr(p capnp.Ptr) Value { + return Value{Struct: capnp.Struct{}.DecodeFromPtr(p)} +} + func (s Value) Which() Value_Which { return Value_Which(s.Struct.Uint16(0)) } @@ -2380,6 +2428,9 @@ func ReadRootAnnotation(msg *capnp.Message) (Annotation, error) { return Annotation{root.Struct()}, err } +func (Annotation) DecodeFromPtr(p capnp.Ptr) Annotation { + return Annotation{Struct: capnp.Struct{}.DecodeFromPtr(p)} +} func (s Annotation) Id() uint64 { return s.Struct.Uint64(0) } @@ -2539,6 +2590,9 @@ func ReadRootCapnpVersion(msg *capnp.Message) (CapnpVersion, error) { return CapnpVersion{root.Struct()}, err } +func (CapnpVersion) DecodeFromPtr(p capnp.Ptr) CapnpVersion { + return CapnpVersion{Struct: capnp.Struct{}.DecodeFromPtr(p)} +} func (s CapnpVersion) Major() uint16 { return s.Struct.Uint16(0) } @@ -2592,6 +2646,9 @@ func ReadRootCodeGeneratorRequest(msg *capnp.Message) (CodeGeneratorRequest, err return CodeGeneratorRequest{root.Struct()}, err } +func (CodeGeneratorRequest) DecodeFromPtr(p capnp.Ptr) CodeGeneratorRequest { + return CodeGeneratorRequest{Struct: capnp.Struct{}.DecodeFromPtr(p)} +} func (s CodeGeneratorRequest) CapnpVersion() (CapnpVersion, error) { p, err := s.Struct.Ptr(2) return CapnpVersion{Struct: p.Struct()}, err @@ -2717,6 +2774,9 @@ func ReadRootCodeGeneratorRequest_RequestedFile(msg *capnp.Message) (CodeGenerat return CodeGeneratorRequest_RequestedFile{root.Struct()}, err } +func (CodeGeneratorRequest_RequestedFile) DecodeFromPtr(p capnp.Ptr) CodeGeneratorRequest_RequestedFile { + return CodeGeneratorRequest_RequestedFile{Struct: capnp.Struct{}.DecodeFromPtr(p)} +} func (s CodeGeneratorRequest_RequestedFile) Id() uint64 { return s.Struct.Uint64(0) } @@ -2796,6 +2856,9 @@ func ReadRootCodeGeneratorRequest_RequestedFile_Import(msg *capnp.Message) (Code return CodeGeneratorRequest_RequestedFile_Import{root.Struct()}, err } +func (CodeGeneratorRequest_RequestedFile_Import) DecodeFromPtr(p capnp.Ptr) CodeGeneratorRequest_RequestedFile_Import { + return CodeGeneratorRequest_RequestedFile_Import{Struct: capnp.Struct{}.DecodeFromPtr(p)} +} func (s CodeGeneratorRequest_RequestedFile_Import) Id() uint64 { return s.Struct.Uint64(0) } diff --git a/list.go b/list.go index 1a42c841..fd182f25 100644 --- a/list.go +++ b/list.go @@ -226,9 +226,20 @@ func (p List) SetStruct(i int, s Struct) error { return nil } +// l.EncodeAsPtr is equivalent to l.ToPtr(); for implementing TypeParam. +// The segment argument is ignored. +func (l List) EncodeAsPtr(*Segment) Ptr { return l.ToPtr() } + +// DecodeFromPtr(p) is equivalent to p.List; for implementing TypeParam. +func (List) DecodeFromPtr(p Ptr) List { return p.List() } + +var _ TypeParam[List] = List{} + // A BitList is a reference to a list of booleans. type BitList struct{ List } +var _ TypeParam[BitList] = BitList{} + // NewBitList creates a new bit list, preferring placement in s. func NewBitList(s *Segment, n int32) (BitList, error) { if n < 0 || n >= 1<<29 { @@ -305,9 +316,15 @@ func (p BitList) String() string { return string(buf) } +func (BitList) DecodeFromPtr(p Ptr) BitList { + return BitList{ List: List{}.DecodeFromPtr(p) } +} + // A PointerList is a reference to an array of pointers. type PointerList struct{ List } +var _ TypeParam[PointerList] = PointerList{} + // NewPointerList allocates a new list of pointers, preferring placement in s. func NewPointerList(s *Segment, n int32) (PointerList, error) { total, ok := wordSize.times(n) @@ -345,9 +362,15 @@ func (p PointerList) Set(i int, v Ptr) error { return p.seg.writePtr(addr, v, false) } +func (PointerList) DecodeFromPtr(p Ptr) PointerList { + return PointerList{ List: List{}.DecodeFromPtr(p) } +} + // TextList is an array of pointers to strings. type TextList struct{ List } +var _ TypeParam[TextList] = TextList{} + // NewTextList allocates a new list of text pointers, preferring placement in s. func NewTextList(s *Segment, n int32) (TextList, error) { pl, err := NewPointerList(s, n) @@ -419,9 +442,15 @@ func (l TextList) String() string { return string(buf) } +func (TextList) DecodeFromPtr(p Ptr) TextList { + return TextList{ List: List{}.DecodeFromPtr(p) } +} + // DataList is an array of pointers to data. type DataList struct{ List } +var _ TypeParam[DataList] = DataList{} + // NewDataList allocates a new list of data pointers, preferring placement in s. func NewDataList(s *Segment, n int32) (DataList, error) { pl, err := NewPointerList(s, n) @@ -479,9 +508,15 @@ func (l DataList) String() string { return string(buf) } +func (DataList) DecodeFromPtr(p Ptr) DataList { + return DataList{ List: List{}.DecodeFromPtr(p) } +} + // A VoidList is a list of zero-sized elements. type VoidList struct{ List } +var _ TypeParam[VoidList] = VoidList{} + // NewVoidList creates a list of voids. No allocation is performed; // s is only used for Segment()'s return value. func NewVoidList(s *Segment, n int32) VoidList { @@ -509,9 +544,15 @@ func (l VoidList) String() string { return string(buf) } +func (VoidList) DecodeFromPtr(p Ptr) VoidList { + return VoidList{ List: List{}.DecodeFromPtr(p) } +} + // A UInt8List is an array of UInt8 values. type UInt8List struct{ List } +var _ TypeParam[UInt8List] = UInt8List{} + // NewUInt8List creates a new list of UInt8, preferring placement in s. func NewUInt8List(s *Segment, n int32) (UInt8List, error) { l, err := newPrimitiveList(s, 1, n) @@ -590,9 +631,15 @@ func (l UInt8List) String() string { return string(buf) } +func (UInt8List) DecodeFromPtr(p Ptr) UInt8List { + return UInt8List{ List: List{}.DecodeFromPtr(p) } +} + // Int8List is an array of Int8 values. type Int8List struct{ List } +var _ TypeParam[Int8List] = Int8List{} + // NewInt8List creates a new list of Int8, preferring placement in s. func NewInt8List(s *Segment, n int32) (Int8List, error) { l, err := newPrimitiveList(s, 1, n) @@ -634,9 +681,15 @@ func (l Int8List) String() string { return string(buf) } +func (Int8List) DecodeFromPtr(p Ptr) Int8List { + return Int8List{ List: List{}.DecodeFromPtr(p) } +} + // A UInt16List is an array of UInt16 values. type UInt16List struct{ List } +var _ TypeParam[UInt16List] = UInt16List{} + // NewUInt16List creates a new list of UInt16, preferring placement in s. func NewUInt16List(s *Segment, n int32) (UInt16List, error) { l, err := newPrimitiveList(s, 2, n) @@ -678,9 +731,15 @@ func (l UInt16List) String() string { return string(buf) } +func (UInt16List) DecodeFromPtr(p Ptr) UInt16List { + return UInt16List{ List: List{}.DecodeFromPtr(p) } +} + // Int16List is an array of Int16 values. type Int16List struct{ List } +var _ TypeParam[Int16List] = Int16List{} + // NewInt16List creates a new list of Int16, preferring placement in s. func NewInt16List(s *Segment, n int32) (Int16List, error) { l, err := newPrimitiveList(s, 2, n) @@ -722,9 +781,15 @@ func (l Int16List) String() string { return string(buf) } +func (Int16List) DecodeFromPtr(p Ptr) Int16List { + return Int16List{ List: List{}.DecodeFromPtr(p) } +} + // UInt32List is an array of UInt32 values. type UInt32List struct{ List } +var _ TypeParam[UInt32List] = UInt32List{} + // NewUInt32List creates a new list of UInt32, preferring placement in s. func NewUInt32List(s *Segment, n int32) (UInt32List, error) { l, err := newPrimitiveList(s, 4, n) @@ -766,9 +831,15 @@ func (l UInt32List) String() string { return string(buf) } +func (UInt32List) DecodeFromPtr(p Ptr) UInt32List { + return UInt32List{ List: List{}.DecodeFromPtr(p) } +} + // Int32List is an array of Int32 values. type Int32List struct{ List } +var _ TypeParam[Int32List] = Int32List{} + // NewInt32List creates a new list of Int32, preferring placement in s. func NewInt32List(s *Segment, n int32) (Int32List, error) { l, err := newPrimitiveList(s, 4, n) @@ -810,9 +881,15 @@ func (l Int32List) String() string { return string(buf) } +func (Int32List) DecodeFromPtr(p Ptr) Int32List { + return Int32List{ List: List{}.DecodeFromPtr(p) } +} + // UInt64List is an array of UInt64 values. type UInt64List struct{ List } +var _ TypeParam[UInt64List] = UInt64List{} + // NewUInt64List creates a new list of UInt64, preferring placement in s. func NewUInt64List(s *Segment, n int32) (UInt64List, error) { l, err := newPrimitiveList(s, 8, n) @@ -854,9 +931,15 @@ func (l UInt64List) String() string { return string(buf) } +func (UInt64List) DecodeFromPtr(p Ptr) UInt64List { + return UInt64List{ List: List{}.DecodeFromPtr(p) } +} + // Int64List is an array of Int64 values. type Int64List struct{ List } +var _ TypeParam[Int64List] = Int64List{} + // NewInt64List creates a new list of Int64, preferring placement in s. func NewInt64List(s *Segment, n int32) (Int64List, error) { l, err := newPrimitiveList(s, 8, n) @@ -898,9 +981,15 @@ func (l Int64List) String() string { return string(buf) } +func (Int64List) DecodeFromPtr(p Ptr) Int64List { + return Int64List{ List: List{}.DecodeFromPtr(p) } +} + // Float32List is an array of Float32 values. type Float32List struct{ List } +var _ TypeParam[Float32List] = Float32List{} + // NewFloat32List creates a new list of Float32, preferring placement in s. func NewFloat32List(s *Segment, n int32) (Float32List, error) { l, err := newPrimitiveList(s, 4, n) @@ -942,9 +1031,15 @@ func (l Float32List) String() string { return string(buf) } +func (Float32List) DecodeFromPtr(p Ptr) Float32List { + return Float32List{ List: List{}.DecodeFromPtr(p) } +} + // Float64List is an array of Float64 values. type Float64List struct{ List } +var _ TypeParam[Float64List] = Float64List{} + // NewFloat64List creates a new list of Float64, preferring placement in s. func NewFloat64List(s *Segment, n int32) (Float64List, error) { l, err := newPrimitiveList(s, 8, n) @@ -986,9 +1081,15 @@ func (l Float64List) String() string { return string(buf) } +func (Float64List) DecodeFromPtr(p Ptr) Float64List { + return Float64List{ List: List{}.DecodeFromPtr(p) } +} + // A list of some Cap'n Proto enum type T. type EnumList[T ~uint16] UInt16List +var _ TypeParam[EnumList[uint16]] = EnumList[uint16]{} + // NewEnumList creates a new list of T, preferring placement in s. func NewEnumList[T ~uint16](s *Segment, n int32) (EnumList[T], error) { l, err := NewUInt16List(s, n) @@ -1010,9 +1111,15 @@ func (l EnumList[T]) String() string { return UInt16List(l).String() } +func (EnumList[T]) DecodeFromPtr(p Ptr) EnumList[T] { + return EnumList[T]{ List: List{}.DecodeFromPtr(p) } +} + // A list of some Cap'n Proto struct type T. type StructList[T ~struct{ Struct }] struct{ List } +var _ TypeParam[StructList[struct{Struct}]] = StructList[struct{Struct}]{} + // At returns the i'th element. func (s StructList[T]) At(i int) T { return T{s.List.Struct(i)} @@ -1037,6 +1144,10 @@ func (s StructList[T]) String() string { return buf.String() } +func (StructList[T]) DecodeFromPtr(p Ptr) StructList[T] { + return StructList[T]{ List: List{}.DecodeFromPtr(p) } +} + type CapList[T ~struct{ Client }] PointerList func (c CapList[T]) At(i int) (T, error) { @@ -1054,6 +1165,10 @@ func (c CapList[T]) Set(i int, v T) error { return pl.Set(i, NewInterface(seg, capId).ToPtr()) } +func (CapList[T]) DecodeFromPtr(p Ptr) CapList[T] { + return CapList[T](PointerList{}.DecodeFromPtr(p)) +} + type listFlags uint8 const ( diff --git a/pointer.go b/pointer.go index e5c5d711..b0ee3735 100644 --- a/pointer.go +++ b/pointer.go @@ -200,6 +200,15 @@ func SamePtr(p, q Ptr) bool { return p.seg == q.seg && p.off == q.off } +// EncodeAsPtr returns the receiver; for implementing TypeParam. +// The segment argument is ignored. +func (p Ptr) EncodeAsPtr(*Segment) Ptr { return p } + +// DecodeFromPtr returns its argument; for implementing TypeParam. +func (Ptr) DecodeFromPtr(p Ptr) Ptr { return p } + +var _ TypeParam[Ptr] = Ptr{} + func unmarshalDefault(def []byte) (Ptr, error) { msg, err := Unmarshal(def) if err != nil { diff --git a/rpc/internal/testcapnp/test.capnp.go b/rpc/internal/testcapnp/test.capnp.go index cb1c53e1..1dca94db 100644 --- a/rpc/internal/testcapnp/test.capnp.go +++ b/rpc/internal/testcapnp/test.capnp.go @@ -39,6 +39,10 @@ func (c PingPong) AddRef() PingPong { } } +func (PingPong) DecodeFromPtr(p capnp.Ptr) PingPong { + return PingPong{Client: capnp.Client{}.DecodeFromPtr(p)} +} + // A PingPong_Server is a PingPong with a local implementation. type PingPong_Server interface { EchoNum(context.Context, PingPong_echoNum) error @@ -129,6 +133,9 @@ func (s PingPong_echoNum_Params) String() string { return str } +func (PingPong_echoNum_Params) DecodeFromPtr(p capnp.Ptr) PingPong_echoNum_Params { + return PingPong_echoNum_Params{Struct: capnp.Struct{}.DecodeFromPtr(p)} +} func (s PingPong_echoNum_Params) N() int64 { return int64(s.Struct.Uint64(0)) } @@ -179,6 +186,9 @@ func (s PingPong_echoNum_Results) String() string { return str } +func (PingPong_echoNum_Results) DecodeFromPtr(p capnp.Ptr) PingPong_echoNum_Results { + return PingPong_echoNum_Results{Struct: capnp.Struct{}.DecodeFromPtr(p)} +} func (s PingPong_echoNum_Results) N() int64 { return int64(s.Struct.Uint64(0)) } @@ -232,6 +242,10 @@ func (c StreamTest) AddRef() StreamTest { } } +func (StreamTest) DecodeFromPtr(p capnp.Ptr) StreamTest { + return StreamTest{Client: capnp.Client{}.DecodeFromPtr(p)} +} + // A StreamTest_Server is a StreamTest with a local implementation. type StreamTest_Server interface { Push(context.Context, StreamTest_push) error @@ -322,6 +336,9 @@ func (s StreamTest_push_Params) String() string { return str } +func (StreamTest_push_Params) DecodeFromPtr(p capnp.Ptr) StreamTest_push_Params { + return StreamTest_push_Params{Struct: capnp.Struct{}.DecodeFromPtr(p)} +} func (s StreamTest_push_Params) Data() ([]byte, error) { p, err := s.Struct.Ptr(0) return []byte(p.Data()), err @@ -396,6 +413,10 @@ func (c CapArgsTest) AddRef() CapArgsTest { } } +func (CapArgsTest) DecodeFromPtr(p capnp.Ptr) CapArgsTest { + return CapArgsTest{Client: capnp.Client{}.DecodeFromPtr(p)} +} + // A CapArgsTest_Server is a CapArgsTest with a local implementation. type CapArgsTest_Server interface { Call(context.Context, CapArgsTest_call) error @@ -517,6 +538,9 @@ func (s CapArgsTest_call_Params) String() string { return str } +func (CapArgsTest_call_Params) DecodeFromPtr(p capnp.Ptr) CapArgsTest_call_Params { + return CapArgsTest_call_Params{Struct: capnp.Struct{}.DecodeFromPtr(p)} +} func (s CapArgsTest_call_Params) Cap() capnp.Client { p, _ := s.Struct.Ptr(0) return p.Interface().Client() @@ -581,6 +605,10 @@ func (s CapArgsTest_call_Results) String() string { return str } +func (CapArgsTest_call_Results) DecodeFromPtr(p capnp.Ptr) CapArgsTest_call_Results { + return CapArgsTest_call_Results{Struct: capnp.Struct{}.DecodeFromPtr(p)} +} + // CapArgsTest_call_Results_List is a list of CapArgsTest_call_Results. type CapArgsTest_call_Results_List = capnp.StructList[CapArgsTest_call_Results] @@ -623,6 +651,10 @@ func (s CapArgsTest_self_Params) String() string { return str } +func (CapArgsTest_self_Params) DecodeFromPtr(p capnp.Ptr) CapArgsTest_self_Params { + return CapArgsTest_self_Params{Struct: capnp.Struct{}.DecodeFromPtr(p)} +} + // CapArgsTest_self_Params_List is a list of CapArgsTest_self_Params. type CapArgsTest_self_Params_List = capnp.StructList[CapArgsTest_self_Params] @@ -665,6 +697,9 @@ func (s CapArgsTest_self_Results) String() string { return str } +func (CapArgsTest_self_Results) DecodeFromPtr(p capnp.Ptr) CapArgsTest_self_Results { + return CapArgsTest_self_Results{Struct: capnp.Struct{}.DecodeFromPtr(p)} +} func (s CapArgsTest_self_Results) Self() CapArgsTest { p, _ := s.Struct.Ptr(0) return CapArgsTest{Client: p.Interface().Client()} diff --git a/std/capnp/compat/json/json.capnp.go b/std/capnp/compat/json/json.capnp.go index 7a097bce..7626798f 100644 --- a/std/capnp/compat/json/json.capnp.go +++ b/std/capnp/compat/json/json.capnp.go @@ -75,6 +75,10 @@ func (s Value) String() string { return str } +func (Value) DecodeFromPtr(p capnp.Ptr) Value { + return Value{Struct: capnp.Struct{}.DecodeFromPtr(p)} +} + func (s Value) Which() Value_Which { return Value_Which(s.Struct.Uint16(0)) } @@ -274,6 +278,9 @@ func (s Value_Field) String() string { return str } +func (Value_Field) DecodeFromPtr(p capnp.Ptr) Value_Field { + return Value_Field{Struct: capnp.Struct{}.DecodeFromPtr(p)} +} func (s Value_Field) Name() (string, error) { p, err := s.Struct.Ptr(0) return p.Text(), err @@ -362,6 +369,9 @@ func (s Value_Call) String() string { return str } +func (Value_Call) DecodeFromPtr(p capnp.Ptr) Value_Call { + return Value_Call{Struct: capnp.Struct{}.DecodeFromPtr(p)} +} func (s Value_Call) Function() (string, error) { p, err := s.Struct.Ptr(0) return p.Text(), err @@ -446,6 +456,9 @@ func (s FlattenOptions) String() string { return str } +func (FlattenOptions) DecodeFromPtr(p capnp.Ptr) FlattenOptions { + return FlattenOptions{Struct: capnp.Struct{}.DecodeFromPtr(p)} +} func (s FlattenOptions) Prefix() (string, error) { p, err := s.Struct.Ptr(0) return p.Text(), err @@ -506,6 +519,9 @@ func (s DiscriminatorOptions) String() string { return str } +func (DiscriminatorOptions) DecodeFromPtr(p capnp.Ptr) DiscriminatorOptions { + return DiscriminatorOptions{Struct: capnp.Struct{}.DecodeFromPtr(p)} +} func (s DiscriminatorOptions) Name() (string, error) { p, err := s.Struct.Ptr(0) return p.Text(), err diff --git a/std/capnp/persistent/persistent.capnp.go b/std/capnp/persistent/persistent.capnp.go index 200336e0..c8ea8821 100644 --- a/std/capnp/persistent/persistent.capnp.go +++ b/std/capnp/persistent/persistent.capnp.go @@ -40,6 +40,10 @@ func (c Persistent) AddRef() Persistent { } } +func (Persistent) DecodeFromPtr(p capnp.Ptr) Persistent { + return Persistent{Client: capnp.Client{}.DecodeFromPtr(p)} +} + // A Persistent_Server is a Persistent with a local implementation. type Persistent_Server interface { Save(context.Context, Persistent_save) error @@ -130,6 +134,9 @@ func (s Persistent_SaveParams) String() string { return str } +func (Persistent_SaveParams) DecodeFromPtr(p capnp.Ptr) Persistent_SaveParams { + return Persistent_SaveParams{Struct: capnp.Struct{}.DecodeFromPtr(p)} +} func (s Persistent_SaveParams) SealFor() (capnp.Ptr, error) { return s.Struct.Ptr(0) } @@ -188,6 +195,9 @@ func (s Persistent_SaveResults) String() string { return str } +func (Persistent_SaveResults) DecodeFromPtr(p capnp.Ptr) Persistent_SaveResults { + return Persistent_SaveResults{Struct: capnp.Struct{}.DecodeFromPtr(p)} +} func (s Persistent_SaveResults) SturdyRef() (capnp.Ptr, error) { return s.Struct.Ptr(0) } diff --git a/std/capnp/rpc/rpc.capnp.go b/std/capnp/rpc/rpc.capnp.go index 284b4eca..de40f836 100644 --- a/std/capnp/rpc/rpc.capnp.go +++ b/std/capnp/rpc/rpc.capnp.go @@ -88,6 +88,10 @@ func (s Message) String() string { return str } +func (Message) DecodeFromPtr(p capnp.Ptr) Message { + return Message{Struct: capnp.Struct{}.DecodeFromPtr(p)} +} + func (s Message) Which() Message_Which { return Message_Which(s.Struct.Uint16(0)) } @@ -611,6 +615,9 @@ func (s Bootstrap) String() string { return str } +func (Bootstrap) DecodeFromPtr(p capnp.Ptr) Bootstrap { + return Bootstrap{Struct: capnp.Struct{}.DecodeFromPtr(p)} +} func (s Bootstrap) QuestionId() uint32 { return s.Struct.Uint32(0) } @@ -699,6 +706,9 @@ func (s Call) String() string { return str } +func (Call) DecodeFromPtr(p capnp.Ptr) Call { + return Call{Struct: capnp.Struct{}.DecodeFromPtr(p)} +} func (s Call) QuestionId() uint32 { return s.Struct.Uint32(0) } @@ -909,6 +919,10 @@ func (s Return) String() string { return str } +func (Return) DecodeFromPtr(p capnp.Ptr) Return { + return Return{Struct: capnp.Struct{}.DecodeFromPtr(p)} +} + func (s Return) Which() Return_Which { return Return_Which(s.Struct.Uint16(6)) } @@ -1087,6 +1101,9 @@ func (s Finish) String() string { return str } +func (Finish) DecodeFromPtr(p capnp.Ptr) Finish { + return Finish{Struct: capnp.Struct{}.DecodeFromPtr(p)} +} func (s Finish) QuestionId() uint32 { return s.Struct.Uint32(0) } @@ -1163,6 +1180,10 @@ func (s Resolve) String() string { return str } +func (Resolve) DecodeFromPtr(p capnp.Ptr) Resolve { + return Resolve{Struct: capnp.Struct{}.DecodeFromPtr(p)} +} + func (s Resolve) Which() Resolve_Which { return Resolve_Which(s.Struct.Uint16(4)) } @@ -1288,6 +1309,9 @@ func (s Release) String() string { return str } +func (Release) DecodeFromPtr(p capnp.Ptr) Release { + return Release{Struct: capnp.Struct{}.DecodeFromPtr(p)} +} func (s Release) Id() uint32 { return s.Struct.Uint32(0) } @@ -1371,6 +1395,9 @@ func (s Disembargo) String() string { return str } +func (Disembargo) DecodeFromPtr(p capnp.Ptr) Disembargo { + return Disembargo{Struct: capnp.Struct{}.DecodeFromPtr(p)} +} func (s Disembargo) Target() (MessageTarget, error) { p, err := s.Struct.Ptr(0) return MessageTarget{Struct: p.Struct()}, err @@ -1499,6 +1526,9 @@ func (s Provide) String() string { return str } +func (Provide) DecodeFromPtr(p capnp.Ptr) Provide { + return Provide{Struct: capnp.Struct{}.DecodeFromPtr(p)} +} func (s Provide) QuestionId() uint32 { return s.Struct.Uint32(0) } @@ -1593,6 +1623,9 @@ func (s Accept) String() string { return str } +func (Accept) DecodeFromPtr(p capnp.Ptr) Accept { + return Accept{Struct: capnp.Struct{}.DecodeFromPtr(p)} +} func (s Accept) QuestionId() uint32 { return s.Struct.Uint32(0) } @@ -1667,6 +1700,9 @@ func (s Join) String() string { return str } +func (Join) DecodeFromPtr(p capnp.Ptr) Join { + return Join{Struct: capnp.Struct{}.DecodeFromPtr(p)} +} func (s Join) QuestionId() uint32 { return s.Struct.Uint32(0) } @@ -1779,6 +1815,10 @@ func (s MessageTarget) String() string { return str } +func (MessageTarget) DecodeFromPtr(p capnp.Ptr) MessageTarget { + return MessageTarget{Struct: capnp.Struct{}.DecodeFromPtr(p)} +} + func (s MessageTarget) Which() MessageTarget_Which { return MessageTarget_Which(s.Struct.Uint16(4)) } @@ -1872,6 +1912,9 @@ func (s Payload) String() string { return str } +func (Payload) DecodeFromPtr(p capnp.Ptr) Payload { + return Payload{Struct: capnp.Struct{}.DecodeFromPtr(p)} +} func (s Payload) Content() (capnp.Ptr, error) { return s.Struct.Ptr(0) } @@ -1984,6 +2027,10 @@ func (s CapDescriptor) String() string { return str } +func (CapDescriptor) DecodeFromPtr(p capnp.Ptr) CapDescriptor { + return CapDescriptor{Struct: capnp.Struct{}.DecodeFromPtr(p)} +} + func (s CapDescriptor) Which() CapDescriptor_Which { return CapDescriptor_Which(s.Struct.Uint16(0)) } @@ -2150,6 +2197,9 @@ func (s PromisedAnswer) String() string { return str } +func (PromisedAnswer) DecodeFromPtr(p capnp.Ptr) PromisedAnswer { + return PromisedAnswer{Struct: capnp.Struct{}.DecodeFromPtr(p)} +} func (s PromisedAnswer) QuestionId() uint32 { return s.Struct.Uint32(0) } @@ -2242,6 +2292,10 @@ func (s PromisedAnswer_Op) String() string { return str } +func (PromisedAnswer_Op) DecodeFromPtr(p capnp.Ptr) PromisedAnswer_Op { + return PromisedAnswer_Op{Struct: capnp.Struct{}.DecodeFromPtr(p)} +} + func (s PromisedAnswer_Op) Which() PromisedAnswer_Op_Which { return PromisedAnswer_Op_Which(s.Struct.Uint16(0)) } @@ -2304,6 +2358,9 @@ func (s ThirdPartyCapDescriptor) String() string { return str } +func (ThirdPartyCapDescriptor) DecodeFromPtr(p capnp.Ptr) ThirdPartyCapDescriptor { + return ThirdPartyCapDescriptor{Struct: capnp.Struct{}.DecodeFromPtr(p)} +} func (s ThirdPartyCapDescriptor) Id() (capnp.Ptr, error) { return s.Struct.Ptr(0) } @@ -2370,6 +2427,9 @@ func (s Exception) String() string { return str } +func (Exception) DecodeFromPtr(p capnp.Ptr) Exception { + return Exception{Struct: capnp.Struct{}.DecodeFromPtr(p)} +} func (s Exception) Reason() (string, error) { p, err := s.Struct.Ptr(0) return p.Text(), err diff --git a/std/capnp/rpctwoparty/rpc-twoparty.capnp.go b/std/capnp/rpctwoparty/rpc-twoparty.capnp.go index 8b3bc6ee..73def667 100644 --- a/std/capnp/rpctwoparty/rpc-twoparty.capnp.go +++ b/std/capnp/rpctwoparty/rpc-twoparty.capnp.go @@ -77,6 +77,9 @@ func (s VatId) String() string { return str } +func (VatId) DecodeFromPtr(p capnp.Ptr) VatId { + return VatId{Struct: capnp.Struct{}.DecodeFromPtr(p)} +} func (s VatId) Side() Side { return Side(s.Struct.Uint16(0)) } @@ -127,6 +130,9 @@ func (s ProvisionId) String() string { return str } +func (ProvisionId) DecodeFromPtr(p capnp.Ptr) ProvisionId { + return ProvisionId{Struct: capnp.Struct{}.DecodeFromPtr(p)} +} func (s ProvisionId) JoinId() uint32 { return s.Struct.Uint32(0) } @@ -177,6 +183,10 @@ func (s RecipientId) String() string { return str } +func (RecipientId) DecodeFromPtr(p capnp.Ptr) RecipientId { + return RecipientId{Struct: capnp.Struct{}.DecodeFromPtr(p)} +} + // RecipientId_List is a list of RecipientId. type RecipientId_List = capnp.StructList[RecipientId] @@ -219,6 +229,10 @@ func (s ThirdPartyCapId) String() string { return str } +func (ThirdPartyCapId) DecodeFromPtr(p capnp.Ptr) ThirdPartyCapId { + return ThirdPartyCapId{Struct: capnp.Struct{}.DecodeFromPtr(p)} +} + // ThirdPartyCapId_List is a list of ThirdPartyCapId. type ThirdPartyCapId_List = capnp.StructList[ThirdPartyCapId] @@ -261,6 +275,9 @@ func (s JoinKeyPart) String() string { return str } +func (JoinKeyPart) DecodeFromPtr(p capnp.Ptr) JoinKeyPart { + return JoinKeyPart{Struct: capnp.Struct{}.DecodeFromPtr(p)} +} func (s JoinKeyPart) JoinId() uint32 { return s.Struct.Uint32(0) } @@ -327,6 +344,9 @@ func (s JoinResult) String() string { return str } +func (JoinResult) DecodeFromPtr(p capnp.Ptr) JoinResult { + return JoinResult{Struct: capnp.Struct{}.DecodeFromPtr(p)} +} func (s JoinResult) JoinId() uint32 { return s.Struct.Uint32(0) } diff --git a/std/capnp/schema/schema.capnp.go b/std/capnp/schema/schema.capnp.go index c19b1180..f64d3eaa 100644 --- a/std/capnp/schema/schema.capnp.go +++ b/std/capnp/schema/schema.capnp.go @@ -75,6 +75,10 @@ func (s Node) String() string { return str } +func (Node) DecodeFromPtr(p capnp.Ptr) Node { + return Node{Struct: capnp.Struct{}.DecodeFromPtr(p)} +} + func (s Node) Which() Node_Which { return Node_Which(s.Struct.Uint16(12)) } @@ -651,6 +655,9 @@ func (s Node_Parameter) String() string { return str } +func (Node_Parameter) DecodeFromPtr(p capnp.Ptr) Node_Parameter { + return Node_Parameter{Struct: capnp.Struct{}.DecodeFromPtr(p)} +} func (s Node_Parameter) Name() (string, error) { p, err := s.Struct.Ptr(0) return p.Text(), err @@ -711,6 +718,9 @@ func (s Node_NestedNode) String() string { return str } +func (Node_NestedNode) DecodeFromPtr(p capnp.Ptr) Node_NestedNode { + return Node_NestedNode{Struct: capnp.Struct{}.DecodeFromPtr(p)} +} func (s Node_NestedNode) Name() (string, error) { p, err := s.Struct.Ptr(0) return p.Text(), err @@ -779,6 +789,9 @@ func (s Node_SourceInfo) String() string { return str } +func (Node_SourceInfo) DecodeFromPtr(p capnp.Ptr) Node_SourceInfo { + return Node_SourceInfo{Struct: capnp.Struct{}.DecodeFromPtr(p)} +} func (s Node_SourceInfo) Id() uint64 { return s.Struct.Uint64(0) } @@ -871,6 +884,9 @@ func (s Node_SourceInfo_Member) String() string { return str } +func (Node_SourceInfo_Member) DecodeFromPtr(p capnp.Ptr) Node_SourceInfo_Member { + return Node_SourceInfo_Member{Struct: capnp.Struct{}.DecodeFromPtr(p)} +} func (s Node_SourceInfo_Member) DocComment() (string, error) { p, err := s.Struct.Ptr(0) return p.Text(), err @@ -971,6 +987,10 @@ func (s Field) String() string { return str } +func (Field) DecodeFromPtr(p capnp.Ptr) Field { + return Field{Struct: capnp.Struct{}.DecodeFromPtr(p)} +} + func (s Field) Which() Field_Which { return Field_Which(s.Struct.Uint16(8)) } @@ -1218,6 +1238,9 @@ func (s Enumerant) String() string { return str } +func (Enumerant) DecodeFromPtr(p capnp.Ptr) Enumerant { + return Enumerant{Struct: capnp.Struct{}.DecodeFromPtr(p)} +} func (s Enumerant) Name() (string, error) { p, err := s.Struct.Ptr(0) return p.Text(), err @@ -1310,6 +1333,9 @@ func (s Superclass) String() string { return str } +func (Superclass) DecodeFromPtr(p capnp.Ptr) Superclass { + return Superclass{Struct: capnp.Struct{}.DecodeFromPtr(p)} +} func (s Superclass) Id() uint64 { return s.Struct.Uint64(0) } @@ -1388,6 +1414,9 @@ func (s Method) String() string { return str } +func (Method) DecodeFromPtr(p capnp.Ptr) Method { + return Method{Struct: capnp.Struct{}.DecodeFromPtr(p)} +} func (s Method) Name() (string, error) { p, err := s.Struct.Ptr(0) return p.Text(), err @@ -1700,6 +1729,10 @@ func (s Type) String() string { return str } +func (Type) DecodeFromPtr(p capnp.Ptr) Type { + return Type{Struct: capnp.Struct{}.DecodeFromPtr(p)} +} + func (s Type) Which() Type_Which { return Type_Which(s.Struct.Uint16(0)) } @@ -2139,6 +2172,9 @@ func (s Brand) String() string { return str } +func (Brand) DecodeFromPtr(p capnp.Ptr) Brand { + return Brand{Struct: capnp.Struct{}.DecodeFromPtr(p)} +} func (s Brand) Scopes() (Brand_Scope_List, error) { p, err := s.Struct.Ptr(0) return Brand_Scope_List{List: p.List()}, err @@ -2223,6 +2259,10 @@ func (s Brand_Scope) String() string { return str } +func (Brand_Scope) DecodeFromPtr(p capnp.Ptr) Brand_Scope { + return Brand_Scope{Struct: capnp.Struct{}.DecodeFromPtr(p)} +} + func (s Brand_Scope) Which() Brand_Scope_Which { return Brand_Scope_Which(s.Struct.Uint16(8)) } @@ -2331,6 +2371,10 @@ func (s Brand_Binding) String() string { return str } +func (Brand_Binding) DecodeFromPtr(p capnp.Ptr) Brand_Binding { + return Brand_Binding{Struct: capnp.Struct{}.DecodeFromPtr(p)} +} + func (s Brand_Binding) Which() Brand_Binding_Which { return Brand_Binding_Which(s.Struct.Uint16(0)) } @@ -2486,6 +2530,10 @@ func (s Value) String() string { return str } +func (Value) DecodeFromPtr(p capnp.Ptr) Value { + return Value{Struct: capnp.Struct{}.DecodeFromPtr(p)} +} + func (s Value) Which() Value_Which { return Value_Which(s.Struct.Uint16(0)) } @@ -2799,6 +2847,9 @@ func (s Annotation) String() string { return str } +func (Annotation) DecodeFromPtr(p capnp.Ptr) Annotation { + return Annotation{Struct: capnp.Struct{}.DecodeFromPtr(p)} +} func (s Annotation) Id() uint64 { return s.Struct.Uint64(0) } @@ -2979,6 +3030,9 @@ func (s CapnpVersion) String() string { return str } +func (CapnpVersion) DecodeFromPtr(p capnp.Ptr) CapnpVersion { + return CapnpVersion{Struct: capnp.Struct{}.DecodeFromPtr(p)} +} func (s CapnpVersion) Major() uint16 { return s.Struct.Uint16(0) } @@ -3045,6 +3099,9 @@ func (s CodeGeneratorRequest) String() string { return str } +func (CodeGeneratorRequest) DecodeFromPtr(p capnp.Ptr) CodeGeneratorRequest { + return CodeGeneratorRequest{Struct: capnp.Struct{}.DecodeFromPtr(p)} +} func (s CodeGeneratorRequest) CapnpVersion() (CapnpVersion, error) { p, err := s.Struct.Ptr(2) return CapnpVersion{Struct: p.Struct()}, err @@ -3187,6 +3244,9 @@ func (s CodeGeneratorRequest_RequestedFile) String() string { return str } +func (CodeGeneratorRequest_RequestedFile) DecodeFromPtr(p capnp.Ptr) CodeGeneratorRequest_RequestedFile { + return CodeGeneratorRequest_RequestedFile{Struct: capnp.Struct{}.DecodeFromPtr(p)} +} func (s CodeGeneratorRequest_RequestedFile) Id() uint64 { return s.Struct.Uint64(0) } @@ -3279,6 +3339,9 @@ func (s CodeGeneratorRequest_RequestedFile_Import) String() string { return str } +func (CodeGeneratorRequest_RequestedFile_Import) DecodeFromPtr(p capnp.Ptr) CodeGeneratorRequest_RequestedFile_Import { + return CodeGeneratorRequest_RequestedFile_Import{Struct: capnp.Struct{}.DecodeFromPtr(p)} +} func (s CodeGeneratorRequest_RequestedFile_Import) Id() uint64 { return s.Struct.Uint64(0) } diff --git a/std/capnp/stream/stream.capnp.go b/std/capnp/stream/stream.capnp.go index 93020e96..edee2a3f 100644 --- a/std/capnp/stream/stream.capnp.go +++ b/std/capnp/stream/stream.capnp.go @@ -33,6 +33,10 @@ func (s StreamResult) String() string { return str } +func (StreamResult) DecodeFromPtr(p capnp.Ptr) StreamResult { + return StreamResult{Struct: capnp.Struct{}.DecodeFromPtr(p)} +} + // StreamResult_List is a list of StreamResult. type StreamResult_List = capnp.StructList[StreamResult] diff --git a/struct.go b/struct.go index bdde010c..bf8d0709 100644 --- a/struct.go +++ b/struct.go @@ -345,3 +345,13 @@ func copyStruct(dst, src Struct) error { return nil } + +// s.EncodeAsPtr is equivalent to s.ToPtr(); for implementing TypeParam. +// The segment argument is ignored. +func (s Struct) EncodeAsPtr(*Segment) Ptr { return s.ToPtr() } + +// DecodeFromPtr(p) is equivalent to p.Struct() (the receiver is ignored). +// for implementing TypeParam. +func (Struct) DecodeFromPtr(p Ptr) Struct { return p.Struct() } + +var _ TypeParam[Struct] = Struct{} diff --git a/typeparam.go b/typeparam.go new file mode 100644 index 00000000..fa58f81c --- /dev/null +++ b/typeparam.go @@ -0,0 +1,16 @@ +package capnp + +// The TypeParam interface must be satisified by a type to be used as a capnproto +// type parameter. This is satisified by all capnproto pointer types. T should +// be instantiated by the type itself; in type parameter lists you will typically +// see parameter/constraints like T TypeParam[T]. +type TypeParam[T any] interface { + // Convert the receiver to a Ptr, storing it in seg if it is not + // already associated with some message (only true for Clients and + // wrappers around them. + EncodeAsPtr(seg *Segment) Ptr + + // Decode the pointer as the type of the receiver. Generally, + // the reciever will be the zero value for the type. + DecodeFromPtr(p Ptr) T +}