// NewTracker returns a new Tracker that reports progress to the // specified client. func NewTracker(client protocol.Client) *Tracker { … } type Tracker … // SetSupportsWorkDoneProgress sets whether the client supports "work done" // progress reporting. It must be set before using the tracker. // // TODO(rfindley): fix this broken initialization pattern. // Also: do we actually need the fall-back progress behavior using ShowMessage? // Surely ShowMessage notifications are too noisy to be worthwhile. func (t *Tracker) SetSupportsWorkDoneProgress(b bool) { … } // SupportsWorkDoneProgress reports whether the tracker supports work done // progress reporting. func (t *Tracker) SupportsWorkDoneProgress() bool { … } // Start notifies the client of work being done on the server. It uses either // ShowMessage RPCs or $/progress messages, depending on the capabilities of // the client. The returned WorkDone handle may be used to report incremental // progress, and to report work completion. In particular, it is an error to // call start and not call end(...) on the returned WorkDone handle. // // If token is empty, a token will be randomly generated. // // The progress item is considered cancellable if the given cancel func is // non-nil. In this case, cancel is called when the work done // // Example: // // func Generate(ctx) (err error) { // ctx, cancel := context.WithCancel(ctx) // defer cancel() // work := s.progress.start(ctx, "generate", "running go generate", cancel) // defer func() { // if err != nil { // work.end(ctx, fmt.Sprintf("generate failed: %v", err)) // } else { // work.end(ctx, "done") // } // }() // // Do the work... // } func (t *Tracker) Start(ctx context.Context, title, message string, token protocol.ProgressToken, cancel func()) *WorkDone { … } func (t *Tracker) Cancel(token protocol.ProgressToken) error { … } type WorkDone … func (wd *WorkDone) Token() protocol.ProgressToken { … } func (wd *WorkDone) doCancel() { … } // Report reports an update on WorkDone report back to the client. func (wd *WorkDone) Report(ctx context.Context, message string, percentage float64) { … } // End reports a workdone completion back to the client. func (wd *WorkDone) End(ctx context.Context, message string) { … } // NewEventWriter returns an [io.Writer] that calls the context's // event printer for each data payload, wrapping it with the // operation=generate tag to distinguish its logs from others. func NewEventWriter(ctx context.Context, operation string) io.Writer { … } type eventWriter … func (ew *eventWriter) Write(p []byte) (n int, err error) { … } // NewWorkDoneWriter wraps a WorkDone handle to provide a Writer interface, // so that workDone reporting can more easily be hooked into commands. func NewWorkDoneWriter(ctx context.Context, wd *WorkDone) io.Writer { … } type workDoneWriter … func (wdw *workDoneWriter) Write(p []byte) (n int, err error) { … }