1package cli
2
3import (
4 "context"
5 "fmt"
6 "io"
7
8 "github.com/spf13/cobra"
9)
10
11// newAppsOperationsWatchCmd creates `operations watch APP --key KEY`: it
12// resumes observing an existing operation through the by-key endpoint until
13// it is terminal, never reissuing the mutation.
14func newAppsOperationsWatchCmd() *cobra.Command {
15 var key string
16 var jsonOut bool
17 cmd := &cobra.Command{
18 Use: "watch APP",
19 Short: "Poll an app operation until it is terminal",
20 Long: `Polls the by-key operation journal until the operation is terminal.
21
22Use it to resume watching an operation from an earlier interrupted run
23without reissuing the mutation. Ctrl-C stops only local polling; the
24daemon-side operation keeps running and the command prints how to resume.`,
25 Args: cobra.ExactArgs(1),
26 RunE: func(cmd *cobra.Command, args []string) error {
27 handle, err := resolveAppPlane()
28 if err != nil {
29 return err
30 }
31 defer handle.close()
32 return runAppsOperationsWatch(cmd.Context(), handle.plane, cmd.OutOrStdout(), cmd.ErrOrStderr(), args[0], key, jsonOut)
33 },
34 }
35 cmd.Flags().StringVar(&key, "key", "", "Request key (required)")
36 cmd.Flags().BoolVar(&jsonOut, "json", false, "Output as JSON")
37 _ = cmd.MarkFlagRequired("key")
38 return cmd
39}
40
41func runAppsOperationsWatch(ctx context.Context, plane ControlPlane, out, errOut io.Writer, app, key string, jsonOut bool) error {
42 if app == "" || key == "" {
43 return fmt.Errorf("APP and --key are required")
44 }
45 return watchOperation(ctx, plane, app, key, nil, out, errOut, jsonOut)
46}