Skip to content

Commit 9e179de

Browse files
committed
Support unpacking the dispatch.sdk.python.v1.Pickled container
1 parent 7b18e2f commit 9e179de

File tree

3 files changed

+42
-13
lines changed

3 files changed

+42
-13
lines changed

cli/any.go

Lines changed: 39 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"fmt"
55
"log/slog"
66

7+
pythonv1 "buf.build/gen/go/stealthrocket/dispatch-proto/protocolbuffers/go/dispatch/sdk/python/v1"
78
"google.golang.org/protobuf/proto"
89
"google.golang.org/protobuf/types/known/anypb"
910
"google.golang.org/protobuf/types/known/wrapperspb"
@@ -13,17 +14,31 @@ func anyString(any *anypb.Any) string {
1314
if any == nil {
1415
return "nil"
1516
}
17+
18+
var s string
19+
var err error
1620
switch any.TypeUrl {
17-
case "type.googleapis.com/google.protobuf.BytesValue":
18-
s, err := anyBytesString(any)
19-
if err != nil {
20-
slog.Debug("cannot parse input/output value", "error", err)
21-
// fallthrough
22-
} else {
23-
return s
21+
case "buf.build/stealthrocket/dispatch-proto/dispatch.sdk.python.v1.Pickled":
22+
var pickled proto.Message
23+
pickled, err = any.UnmarshalNew()
24+
if err == nil {
25+
if p, ok := pickled.(*pythonv1.Pickled); ok {
26+
s, err = pythonPickleString(p.PickledValue)
27+
} else {
28+
err = fmt.Errorf("invalid pickled message: %T", p)
29+
}
2430
}
31+
case "type.googleapis.com/google.protobuf.BytesValue":
32+
s, err = anyBytesString(any)
33+
default:
34+
// TODO: support unpacking other types of serialized values
35+
err = fmt.Errorf("not implemented: %s", any.TypeUrl)
36+
}
37+
if err != nil {
38+
slog.Debug("cannot parse input/output value", "error", err)
39+
return fmt.Sprintf("%s(?)", any.TypeUrl)
2540
}
26-
return fmt.Sprintf("%s(?)", any.TypeUrl)
41+
return s
2742
}
2843

2944
func anyBytesString(any *anypb.Any) (string, error) {
@@ -37,6 +52,20 @@ func anyBytesString(any *anypb.Any) (string, error) {
3752
}
3853
b := bv.Value
3954

40-
// TODO: support unpacking other types of serialized values
41-
return pythonPickleString(b)
55+
// The Python SDK originally wrapped pickled values in a
56+
// wrapperspb.BytesValue. Try to unpickle the bytes first,
57+
// and return literal bytes if they cannot be unpickled.
58+
s, err := pythonPickleString(b)
59+
if err != nil {
60+
s = string(truncateBytes(b))
61+
}
62+
return s, nil
63+
}
64+
65+
func truncateBytes(b []byte) []byte {
66+
const n = 4
67+
if len(b) < n {
68+
return b
69+
}
70+
return append(b[:n:n], "..."...)
4271
}

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ module github.com/dispatchrun/dispatch
33
go 1.22.0
44

55
require (
6-
buf.build/gen/go/stealthrocket/dispatch-proto/protocolbuffers/go v1.34.2-20240429010127-639d52c5db75.2
6+
buf.build/gen/go/stealthrocket/dispatch-proto/protocolbuffers/go v1.34.2-20240612225639-f8a6c0a10402.2
77
github.com/charmbracelet/bubbles v0.18.0
88
github.com/charmbracelet/bubbletea v0.25.0
99
github.com/charmbracelet/lipgloss v0.9.1

go.sum

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go v1.34.2-20231115204500-e097f827e652.2 h1:ilkjxsfdhrdeLL582R4XH+IQLrV2Y31lHB8jb3AQSJA=
22
buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go v1.34.2-20231115204500-e097f827e652.2/go.mod h1:ylS4c28ACSI59oJrOdW4pHS4n0Hw4TgSPHn8rpHl4Yw=
3-
buf.build/gen/go/stealthrocket/dispatch-proto/protocolbuffers/go v1.34.2-20240429010127-639d52c5db75.2 h1:1r8eO7RcxrZXs1FZLLQb/S/1SOBXfGsHQoDSPwFuu10=
4-
buf.build/gen/go/stealthrocket/dispatch-proto/protocolbuffers/go v1.34.2-20240429010127-639d52c5db75.2/go.mod h1:Z1Y+G5dzXnHxfdt7l3S9kLBWV6iO2Zw3z2DvY9yKpaw=
3+
buf.build/gen/go/stealthrocket/dispatch-proto/protocolbuffers/go v1.34.2-20240612225639-f8a6c0a10402.2 h1:GfZ4I61ZZiXk6zXLZaMNz1rSW0MxlBRRc5n5GOUbIg4=
4+
buf.build/gen/go/stealthrocket/dispatch-proto/protocolbuffers/go v1.34.2-20240612225639-f8a6c0a10402.2/go.mod h1:Z1Y+G5dzXnHxfdt7l3S9kLBWV6iO2Zw3z2DvY9yKpaw=
55
github.com/atotto/clipboard v0.1.4 h1:EH0zSVneZPSuFR11BlR9YppQTVDbh5+16AmcJi4g1z4=
66
github.com/atotto/clipboard v0.1.4/go.mod h1:ZY9tmq7sm5xIbd9bOK4onWV4S6X0u6GY7Vn0Yu86PYI=
77
github.com/aymanbagabas/go-osc52/v2 v2.0.1 h1:HwpRHbFMcZLEVr42D4p7XBqjyuxQH5SMiErDT4WkJ2k=

0 commit comments

Comments
 (0)