Skip to content

Commit 8d8d510

Browse files
committed
fix(go): correctly handle nested futures
Signed-off-by: Roman Volosatovs <rvolosatovs@riseup.net>
1 parent 0bc0292 commit 8d8d510

22 files changed

Lines changed: 412 additions & 294 deletions

File tree

crates/wit-bindgen-go/src/interface.rs

Lines changed: 47 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ pub fn flatten_ty<'a>(resolve: &'a Resolve, ty: &Type) -> impl Iterator<Item = T
6161
continue;
6262
}
6363
TypeDefKind::Tuple(ref t) => {
64-
return Box::new(t.types.iter().map(|ty| *ty)) as Box<dyn Iterator<Item = _>>
64+
return Box::new(t.types.iter().copied()) as Box<dyn Iterator<Item = _>>
6565
}
6666
_ => {}
6767
}
@@ -546,7 +546,7 @@ impl InterfaceGenerator<'_> {
546546
let errors = self.deps.errors();
547547
let slog = self.deps.slog();
548548
let wrpc = self.deps.wrpc();
549-
uwrite!(self.src, "func(r {wrpc}.IndexReader, path ...uint32) (");
549+
uwrite!(self.src, "func(r {wrpc}.IndexReadCloser, path ...uint32) (");
550550
self.print_list(ty);
551551
uwrite!(
552552
self.src,
@@ -605,7 +605,7 @@ impl InterfaceGenerator<'_> {
605605
let fmt = self.deps.fmt();
606606
let slog = self.deps.slog();
607607
let wrpc = self.deps.wrpc();
608-
uwrite!(self.src, "func(r {wrpc}.IndexReader, path ...uint32) (");
608+
uwrite!(self.src, "func(r {wrpc}.IndexReadCloser, path ...uint32) (");
609609
self.print_option(ty, true);
610610
uwrite!(
611611
self.src,
@@ -652,7 +652,10 @@ impl InterfaceGenerator<'_> {
652652
let fmt = self.deps.fmt();
653653
let slog = self.deps.slog();
654654
let wrpc = self.deps.wrpc();
655-
uwrite!(self.src, "func(r {wrpc}.IndexReader, path ...uint32) (*");
655+
uwrite!(
656+
self.src,
657+
"func(r {wrpc}.IndexReadCloser, path ...uint32) (*"
658+
);
656659
self.print_result(ty);
657660
uwriteln!(
658661
self.src,
@@ -736,7 +739,7 @@ impl InterfaceGenerator<'_> {
736739

737740
uwriteln!(
738741
self.src,
739-
r#"func(r {wrpc}.IndexReader, path ...uint32) (*{name}, error) {{
742+
r#"func(r {wrpc}.IndexReadCloser, path ...uint32) (*{name}, error) {{
740743
v := &{name}{{}}
741744
var err error"#
742745
);
@@ -828,7 +831,7 @@ impl InterfaceGenerator<'_> {
828831

829832
uwrite!(
830833
self.src,
831-
r#"func(r {wrpc}.IndexReader, path ...uint32) (*{name}, error) {{
834+
r#"func(r {wrpc}.IndexReadCloser, path ...uint32) (*{name}, error) {{
832835
v := &{name}{{}}
833836
n, err := "#
834837
);
@@ -891,7 +894,10 @@ impl InterfaceGenerator<'_> {
891894
_ => {
892895
let wrpc = self.deps.wrpc();
893896

894-
uwrite!(self.src, "func(r {wrpc}.IndexReader, path ...uint32) (*");
897+
uwrite!(
898+
self.src,
899+
"func(r {wrpc}.IndexReadCloser, path ...uint32) (*"
900+
);
895901
self.print_tuple(ty, true);
896902
self.push_str(", error) {\n");
897903
self.push_str("v := &");
@@ -938,7 +944,7 @@ impl InterfaceGenerator<'_> {
938944

939945
uwriteln!(
940946
self.src,
941-
r#"func(r {wrpc}.IndexReader, path ...uint32) ({io}.ReadCloser, error) {{
947+
r#"func(r {wrpc}.IndexReadCloser, path ...uint32) ({io}.ReadCloser, error) {{
942948
{slog}.Debug("reading byte list future status byte")
943949
status, err := r.ReadByte()
944950
if err != nil {{
@@ -947,9 +953,12 @@ impl InterfaceGenerator<'_> {
947953
switch status {{
948954
case 0:
949955
{slog}.Debug("indexing pending byte list future reader")
950-
r, err := r.Index(path...)
951-
if err != nil {{
952-
return nil, {fmt}.Errorf("failed to index nested byte list future reader: %w", err)
956+
if len(path) > 0 {{
957+
var err error
958+
r, err = r.Index(path...)
959+
if err != nil {{
960+
return nil, {fmt}.Errorf("failed to index nested byte list future reader: %w", err)
961+
}}
953962
}}
954963
return {wrpc}.NewByteStreamReader(r), nil
955964
case 1:
@@ -984,7 +993,7 @@ impl InterfaceGenerator<'_> {
984993

985994
uwrite!(
986995
self.src,
987-
r#"func(r {wrpc}.IndexReader, path ...uint32) ({wrpc}.Receiver["#
996+
r#"func(r {wrpc}.IndexReadCloser, path ...uint32) ({wrpc}.Receiver["#
988997
);
989998
self.print_opt_ty(ty, true);
990999
uwrite!(
@@ -998,11 +1007,14 @@ impl InterfaceGenerator<'_> {
9981007
switch status {{
9991008
case 0:
10001009
{slog}.Debug("indexing pending future reader")
1001-
r, err := r.Index(path...)
1002-
if err != nil {{
1003-
return nil, {fmt}.Errorf("failed to index nested future reader: %w", err)
1010+
if len(path) > 0 {{
1011+
var err error
1012+
r, err = r.Index(path...)
1013+
if err != nil {{
1014+
return nil, {fmt}.Errorf("failed to index nested future reader: %w", err)
1015+
}}
10041016
}}
1005-
return {wrpc}.NewDecodeReceiver(r, func(r {wrpc}.IndexReader) ("#
1017+
return {wrpc}.NewDecodeReceiver(r, func(r {wrpc}.IndexReadCloser) ("#
10061018
);
10071019
self.print_opt_ty(ty, true);
10081020
uwrite!(
@@ -1059,17 +1071,20 @@ impl InterfaceGenerator<'_> {
10591071

10601072
uwriteln!(
10611073
self.src,
1062-
r#"func(r {wrpc}.IndexReader, path ...uint32) ({io}.ReadCloser, error) {{
1074+
r#"func(r {wrpc}.IndexReadCloser, path ...uint32) ({io}.ReadCloser, error) {{
10631075
{slog}.Debug("reading byte stream status byte")
10641076
status, err := r.ReadByte()
10651077
if err != nil {{
10661078
return nil, {fmt}.Errorf("failed to read byte stream status byte: %w", err)
10671079
}}
10681080
switch status {{
10691081
case 0:
1070-
r, err := r.Index(path...)
1071-
if err != nil {{
1072-
return nil, {fmt}.Errorf("failed to index nested byte stream reader: %w", err)
1082+
if len(path) > 0 {{
1083+
var err error
1084+
r, err = r.Index(path...)
1085+
if err != nil {{
1086+
return nil, {fmt}.Errorf("failed to index nested byte stream reader: %w", err)
1087+
}}
10731088
}}
10741089
return {wrpc}.NewByteStreamReader(r), nil
10751090
case 1:
@@ -1107,7 +1122,7 @@ impl InterfaceGenerator<'_> {
11071122

11081123
uwrite!(
11091124
self.src,
1110-
r#"func(r {wrpc}.IndexReader, path ...uint32) ({wrpc}.Receiver["#
1125+
r#"func(r {wrpc}.IndexReadCloser, path ...uint32) ({wrpc}.Receiver["#
11111126
);
11121127
self.print_list(ty);
11131128
uwrite!(
@@ -1120,12 +1135,15 @@ impl InterfaceGenerator<'_> {
11201135
}}
11211136
switch status {{
11221137
case 0:
1123-
r, err := r.Index(path...)
1124-
if err != nil {{
1125-
return nil, {fmt}.Errorf("failed to index nested stream reader: %w", err)
1138+
if len(path) > 0 {{
1139+
var err error
1140+
r, err = r.Index(path...)
1141+
if err != nil {{
1142+
return nil, {fmt}.Errorf("failed to index nested stream reader: %w", err)
1143+
}}
11261144
}}
11271145
var total uint32
1128-
return {wrpc}.NewDecodeReceiver(r, func(r {wrpc}.IndexReader) ("#
1146+
return {wrpc}.NewDecodeReceiver(r, func(r {wrpc}.IndexReadCloser) ("#
11291147
);
11301148
self.print_list(ty);
11311149
uwrite!(
@@ -2602,14 +2620,14 @@ func ServeInterface(s {wrpc}.Server, h Handler) (stop func() error, err error) {
26022620

26032621
let mut idx = 0usize;
26042622
for (i, ty) in func.results.iter_types().enumerate() {
2605-
for (j, _) in flatten_ty(&self.resolve, ty).enumerate() {
2623+
for (j, _) in flatten_ty(self.resolve, ty).enumerate() {
26062624
uwrite!(
26072625
self.src,
26082626
r#"
26092627
case {idx}:
26102628
w, err := w.Index("#,
26112629
);
2612-
if is_tuple(&self.resolve, ty) {
2630+
if is_tuple(self.resolve, ty) {
26132631
uwrite!(self.src, "{i}, ");
26142632
}
26152633
uwrite!(
@@ -2875,13 +2893,13 @@ func ServeInterface(s {wrpc}.Server, h Handler) (stop func() error, err error) {
28752893

28762894
let mut idx = 0usize;
28772895
for (i, rty) in func.results.iter_types().enumerate() {
2878-
for (j, ty) in flatten_ty(&self.resolve, rty).enumerate() {
2896+
for (j, ty) in flatten_ty(self.resolve, rty).enumerate() {
28792897
uwrite!(
28802898
self.src,
28812899
"
28822900
r{idx}__, err__ = "
28832901
);
2884-
let path = if is_tuple(&self.resolve, rty) {
2902+
let path = if is_tuple(self.resolve, rty) {
28852903
format!("[]uint32{{ {i}, {j} }}")
28862904
} else {
28872905
format!("[]uint32{{ {idx} }}")
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
1-
// Generated by `wit-bindgen-wrpc-go` 0.9.0. DO NOT EDIT!
1+
// Generated by `wit-bindgen-wrpc-go` 0.9.1. DO NOT EDIT!
22
// client package contains wRPC bindings for `client` world
33
package client

examples/go/hello-client/bindings/wrpc_examples/hello/handler/bindings.wrpc.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// Generated by `wit-bindgen-wrpc-go` 0.9.0. DO NOT EDIT!
1+
// Generated by `wit-bindgen-wrpc-go` 0.9.1. DO NOT EDIT!
22
package handler
33

44
import (

examples/go/hello-server/bindings/exports/wrpc_examples/hello/handler/bindings.wrpc.go

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// Generated by `wit-bindgen-wrpc-go` 0.9.0. DO NOT EDIT!
1+
// Generated by `wit-bindgen-wrpc-go` 0.9.1. DO NOT EDIT!
22
package handler
33

44
import (
@@ -82,18 +82,21 @@ func ServeInterface(s wrpc.Server, h Handler) (stop func() error, err error) {
8282
}
8383
if len(writes) > 0 {
8484
for index, write := range writes {
85-
w, err := w.Index(index)
86-
if err != nil {
87-
slog.ErrorContext(ctx, "failed to index result writer", "index", index, "instance", "wrpc-examples:hello/handler", "name", "hello", "err", err)
88-
return
89-
}
90-
index := index
91-
write := write
92-
go func() {
93-
if err := write(w); err != nil {
94-
slog.WarnContext(ctx, "failed to write nested result value", "index", index, "instance", "wrpc-examples:hello/handler", "name", "hello", "err", err)
85+
_ = write
86+
switch index {
87+
case 0:
88+
w, err := w.Index(0)
89+
if err != nil {
90+
slog.ErrorContext(ctx, "failed to index result writer", "instance", "wrpc-examples:hello/handler", "name", "hello", "err", err)
91+
return
9592
}
96-
}()
93+
write := write
94+
go func() {
95+
if err := write(w); err != nil {
96+
slog.WarnContext(ctx, "failed to write nested result value", "instance", "wrpc-examples:hello/handler", "name", "hello", "err", err)
97+
}
98+
}()
99+
}
97100
}
98101
}
99102
})

examples/go/hello-server/bindings/server.wrpc.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// Generated by `wit-bindgen-wrpc-go` 0.9.0. DO NOT EDIT!
1+
// Generated by `wit-bindgen-wrpc-go` 0.9.1. DO NOT EDIT!
22
// server package contains wRPC bindings for `server` world
33
package server
44

0 commit comments

Comments
 (0)