Skip to content

Commit f35092f

Browse files
committed
Generate Go interfaces for shape-distinct unions
1 parent 5edc38e commit f35092f

11 files changed

Lines changed: 452 additions & 118 deletions

File tree

go/internal/e2e/pending_work_resume_e2e_test.go

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -241,9 +241,7 @@ func TestPendingWorkResumeE2E(t *testing.T) {
241241

242242
toolResult, err := session2.RPC.Tools.HandlePendingToolCall(t.Context(), &rpc.HandlePendingToolCallRequest{
243243
RequestID: toolEvent.RequestID,
244-
Result: &rpc.ExternalToolResult{
245-
String: copilot.String("EXTERNAL_RESUMED_BETA"),
246-
},
244+
Result: rpc.ExternalToolStringResult("EXTERNAL_RESUMED_BETA"),
247245
})
248246
if err != nil {
249247
t.Fatalf("Failed to handle pending tool call: %v", err)
@@ -363,14 +361,14 @@ func TestPendingWorkResumeE2E(t *testing.T) {
363361
// Resolve B first to verify ordering doesn't matter.
364362
resB, err := session2.RPC.Tools.HandlePendingToolCall(t.Context(), &rpc.HandlePendingToolCallRequest{
365363
RequestID: toolEvents["pending_lookup_b"].RequestID,
366-
Result: &rpc.ExternalToolResult{String: copilot.String("PARALLEL_B_BETA")},
364+
Result: rpc.ExternalToolStringResult("PARALLEL_B_BETA"),
367365
})
368366
if err != nil || !resB.Success {
369367
t.Fatalf("HandlePendingToolCall(B) failed: err=%v result=%+v", err, resB)
370368
}
371369
resA, err := session2.RPC.Tools.HandlePendingToolCall(t.Context(), &rpc.HandlePendingToolCallRequest{
372370
RequestID: toolEvents["pending_lookup_a"].RequestID,
373-
Result: &rpc.ExternalToolResult{String: copilot.String("PARALLEL_A_ALPHA")},
371+
Result: rpc.ExternalToolStringResult("PARALLEL_A_ALPHA"),
374372
})
375373
if err != nil || !resA.Success {
376374
t.Fatalf("HandlePendingToolCall(A) failed: err=%v result=%+v", err, resA)
@@ -553,9 +551,7 @@ func TestPendingWorkResumeE2E(t *testing.T) {
553551
// handleable via HandlePendingToolCall.
554552
toolResult, err := session2.RPC.Tools.HandlePendingToolCall(t.Context(), &rpc.HandlePendingToolCallRequest{
555553
RequestID: toolEvent.RequestID,
556-
Result: &rpc.ExternalToolResult{
557-
String: copilot.String("EXTERNAL_RESUMED_BETA"),
558-
},
554+
Result: rpc.ExternalToolStringResult("EXTERNAL_RESUMED_BETA"),
559555
})
560556
if err != nil {
561557
t.Fatalf("Failed to handle pending tool call: %v", err)

go/internal/e2e/rpc_tasks_and_handlers_e2e_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ func TestRpcTasksAndHandlersE2E(t *testing.T) {
9090

9191
tool, err := session.RPC.Tools.HandlePendingToolCall(t.Context(), &rpc.HandlePendingToolCallRequest{
9292
RequestID: "missing-tool-request",
93-
Result: &rpc.ExternalToolResult{String: copilot.String("tool result")},
93+
Result: rpc.ExternalToolStringResult("tool result"),
9494
})
9595
if err != nil {
9696
t.Fatalf("Tools.HandlePendingToolCall failed: %v", err)

go/rpc/generated_rpc.go

Lines changed: 21 additions & 11 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

go/rpc/generated_rpc_union_test.go

Lines changed: 21 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import (
66
)
77

88
func TestExternalToolResultJSONUnion(t *testing.T) {
9-
stringResult := ExternalToolResult{String: stringPtr("tool result")}
9+
var stringResult ExternalToolResult = ExternalToolStringResult("tool result")
1010
raw, err := json.Marshal(stringResult)
1111
if err != nil {
1212
t.Fatalf("marshal string result: %v", err)
@@ -15,15 +15,16 @@ func TestExternalToolResultJSONUnion(t *testing.T) {
1515
t.Fatalf("marshal string result = %s", raw)
1616
}
1717

18-
var decodedString ExternalToolResult
19-
if err := json.Unmarshal([]byte(`"tool result"`), &decodedString); err != nil {
18+
decodedString, err := unmarshalExternalToolResult([]byte(`"tool result"`))
19+
if err != nil {
2020
t.Fatalf("unmarshal string result: %v", err)
2121
}
22-
if decodedString.String == nil || *decodedString.String != "tool result" {
22+
decodedStringValue, ok := decodedString.(ExternalToolStringResult)
23+
if !ok || string(decodedStringValue) != "tool result" {
2324
t.Fatalf("unmarshal string result = %#v", decodedString)
2425
}
2526

26-
objectResult := ExternalToolResult{ExternalToolTextResultForLlm: &ExternalToolTextResultForLlm{TextResultForLlm: "expanded"}}
27+
var objectResult ExternalToolResult = &ExternalToolTextResultForLlm{TextResultForLlm: "expanded"}
2728
raw, err = json.Marshal(objectResult)
2829
if err != nil {
2930
t.Fatalf("marshal object result: %v", err)
@@ -32,17 +33,18 @@ func TestExternalToolResultJSONUnion(t *testing.T) {
3233
t.Fatalf("marshal object result = %s", raw)
3334
}
3435

35-
var decodedObject ExternalToolResult
36-
if err := json.Unmarshal([]byte(`{"textResultForLlm":"expanded"}`), &decodedObject); err != nil {
36+
decodedObject, err := unmarshalExternalToolResult([]byte(`{"textResultForLlm":"expanded"}`))
37+
if err != nil {
3738
t.Fatalf("unmarshal object result: %v", err)
3839
}
39-
if decodedObject.ExternalToolTextResultForLlm == nil || decodedObject.ExternalToolTextResultForLlm.TextResultForLlm != "expanded" {
40+
decodedObjectValue, ok := decodedObject.(*ExternalToolTextResultForLlm)
41+
if !ok || decodedObjectValue.TextResultForLlm != "expanded" {
4042
t.Fatalf("unmarshal object result = %#v", decodedObject)
4143
}
4244
}
4345

4446
func TestFilterMappingJSONUnion(t *testing.T) {
45-
mapping := FilterMapping{EnumMap: map[string]FilterMappingValue{"secret": FilterMappingValueHiddenCharacters}}
47+
var mapping FilterMapping = FilterMappingEnumMap{"secret": FilterMappingValueHiddenCharacters}
4648
raw, err := json.Marshal(mapping)
4749
if err != nil {
4850
t.Fatalf("marshal filter mapping map: %v", err)
@@ -51,28 +53,30 @@ func TestFilterMappingJSONUnion(t *testing.T) {
5153
t.Fatalf("marshal filter mapping map = %s", raw)
5254
}
5355

54-
var decodedMap FilterMapping
55-
if err := json.Unmarshal([]byte(`{"secret":"hidden_characters"}`), &decodedMap); err != nil {
56+
decodedMap, err := unmarshalFilterMapping([]byte(`{"secret":"hidden_characters"}`))
57+
if err != nil {
5658
t.Fatalf("unmarshal filter mapping map: %v", err)
5759
}
58-
if decodedMap.EnumMap["secret"] != FilterMappingValueHiddenCharacters {
60+
decodedMapValue, ok := decodedMap.(FilterMappingEnumMap)
61+
if !ok || decodedMapValue["secret"] != FilterMappingValueHiddenCharacters {
5962
t.Fatalf("unmarshal filter mapping map = %#v", decodedMap)
6063
}
6164

62-
enumValue := FilterMappingStringMarkdown
63-
raw, err = json.Marshal(FilterMapping{Enum: &enumValue})
65+
var enumValue FilterMapping = FilterMappingStringMarkdown
66+
raw, err = json.Marshal(enumValue)
6467
if err != nil {
6568
t.Fatalf("marshal filter mapping enum: %v", err)
6669
}
6770
if string(raw) != `"markdown"` {
6871
t.Fatalf("marshal filter mapping enum = %s", raw)
6972
}
7073

71-
var decodedEnum FilterMapping
72-
if err := json.Unmarshal([]byte(`"markdown"`), &decodedEnum); err != nil {
74+
decodedEnum, err := unmarshalFilterMapping([]byte(`"markdown"`))
75+
if err != nil {
7376
t.Fatalf("unmarshal filter mapping enum: %v", err)
7477
}
75-
if decodedEnum.Enum == nil || *decodedEnum.Enum != FilterMappingStringMarkdown {
78+
decodedEnumValue, ok := decodedEnum.(FilterMappingString)
79+
if !ok || decodedEnumValue != FilterMappingStringMarkdown {
7680
t.Fatalf("unmarshal filter mapping enum = %#v", decodedEnum)
7781
}
7882
}
@@ -182,7 +186,3 @@ func TestUIElicitationSchemaPropertyJSONUnion(t *testing.T) {
182186
t.Fatalf("round-trip confirmed property = %T, want *UIElicitationSchemaPropertyBoolean", roundTrip.Properties["confirmed"])
183187
}
184188
}
185-
186-
func stringPtr(value string) *string {
187-
return &value
188-
}

0 commit comments

Comments
 (0)