Browse code

client/pkg/jsonmessage: make DisplayJSONMessages accept a iter.Seq2

The `DisplayJSONMessages` only accepted a `JSONMessagesStream`. This meant that
it would not accept the output from (for example) [client.ImagePushResponse].

This patch:

- Makes `DisplayJSONMessages` accept any `iter.Seq2[jsonstream.Message, error]`
- Makes `JSONMessagesStream` an alias instead of a concrete type (TBD if we
actually need the type).
- Some minor cleanups in the implementation.

[client.ImagePushResponse]: https://github.com/moby/moby/blob/fa87120ae64a170fd42096de3b873b439b95016b/client/image_push.go#L20-L24

Signed-off-by: Sebastiaan van Stijn <github@gone.nl>

Sebastiaan van Stijn authored on 2026/02/19 21:45:02
Showing 2 changed files
... ...
@@ -144,14 +144,14 @@ func Display(jm jsonstream.Message, out io.Writer, isTerminal bool, width uint16
144 144
 	return nil
145 145
 }
146 146
 
147
-type JSONMessagesStream iter.Seq2[jsonstream.Message, error]
147
+type JSONMessagesStream = iter.Seq2[jsonstream.Message, error]
148 148
 
149 149
 // DisplayJSONMessagesStream reads a JSON message stream from in, and writes
150 150
 // each [JSONMessage] to out.
151 151
 // see DisplayJSONMessages for details
152 152
 func DisplayJSONMessagesStream(in io.Reader, out io.Writer, terminalFd uintptr, isTerminal bool, auxCallback func(jsonstream.Message)) error {
153 153
 	dec := json.NewDecoder(in)
154
-	var f JSONMessagesStream = func(yield func(jsonstream.Message, error) bool) {
154
+	f := func(yield func(jsonstream.Message, error) bool) {
155 155
 		for {
156 156
 			var jm jsonstream.Message
157 157
 			err := dec.Decode(&jm)
... ...
@@ -183,7 +183,7 @@ func DisplayJSONMessagesStream(in io.Reader, out io.Writer, terminalFd uintptr,
183 183
 //   - auxCallback allows handling the [JSONMessage.Aux] field. It is
184 184
 //     called if a JSONMessage contains an Aux field, in which case
185 185
 //     DisplayJSONMessagesStream does not present the JSONMessage.
186
-func DisplayJSONMessages(messages JSONMessagesStream, out io.Writer, terminalFd uintptr, isTerminal bool, auxCallback func(jsonstream.Message)) error {
186
+func DisplayJSONMessages(messages iter.Seq2[jsonstream.Message, error], out io.Writer, terminalFd uintptr, isTerminal bool, auxCallback func(jsonstream.Message)) error {
187 187
 	ids := make(map[string]uint)
188 188
 	var width uint16 = 200
189 189
 	if isTerminal {
... ...
@@ -144,14 +144,14 @@ func Display(jm jsonstream.Message, out io.Writer, isTerminal bool, width uint16
144 144
 	return nil
145 145
 }
146 146
 
147
-type JSONMessagesStream iter.Seq2[jsonstream.Message, error]
147
+type JSONMessagesStream = iter.Seq2[jsonstream.Message, error]
148 148
 
149 149
 // DisplayJSONMessagesStream reads a JSON message stream from in, and writes
150 150
 // each [JSONMessage] to out.
151 151
 // see DisplayJSONMessages for details
152 152
 func DisplayJSONMessagesStream(in io.Reader, out io.Writer, terminalFd uintptr, isTerminal bool, auxCallback func(jsonstream.Message)) error {
153 153
 	dec := json.NewDecoder(in)
154
-	var f JSONMessagesStream = func(yield func(jsonstream.Message, error) bool) {
154
+	f := func(yield func(jsonstream.Message, error) bool) {
155 155
 		for {
156 156
 			var jm jsonstream.Message
157 157
 			err := dec.Decode(&jm)
... ...
@@ -183,7 +183,7 @@ func DisplayJSONMessagesStream(in io.Reader, out io.Writer, terminalFd uintptr,
183 183
 //   - auxCallback allows handling the [JSONMessage.Aux] field. It is
184 184
 //     called if a JSONMessage contains an Aux field, in which case
185 185
 //     DisplayJSONMessagesStream does not present the JSONMessage.
186
-func DisplayJSONMessages(messages JSONMessagesStream, out io.Writer, terminalFd uintptr, isTerminal bool, auxCallback func(jsonstream.Message)) error {
186
+func DisplayJSONMessages(messages iter.Seq2[jsonstream.Message, error], out io.Writer, terminalFd uintptr, isTerminal bool, auxCallback func(jsonstream.Message)) error {
187 187
 	ids := make(map[string]uint)
188 188
 	var width uint16 = 200
189 189
 	if isTerminal {