in src/ulsp/controller/user-guidance/user_guidance.go [184:262]
func (c *controller) NotifyMessage(ctx context.Context, msg Message) (*Action, error) {
selection, err := c.statShownMessage(msg)
if err != nil && !errors.Is(err, errNeverShownMessage) {
return nil, fmt.Errorf("stat shown message: %w", err)
}
if len(msg.Actions) == 0 {
if err == nil {
return nil, nil
}
if err := c.ideGateway.ShowMessage(ctx, &protocol.ShowMessageParams{
Type: protocol.ToMessageType(msg.Type),
Message: msg.Message,
}); err != nil {
return nil, fmt.Errorf("show message: %w", err)
}
if err := c.markMessageAsShown(msg, nil); err != nil {
return nil, fmt.Errorf("mark message as shown: %w", err)
}
return nil, nil
}
if selection == nil {
showMessageRequestParams := protocol.ShowMessageRequestParams{
Type: protocol.ToMessageType(msg.Type),
Message: msg.Message,
Actions: make([]protocol.MessageActionItem, 0, len(msg.Actions)),
}
for _, action := range msg.Actions {
showMessageRequestParams.Actions = append(showMessageRequestParams.Actions, protocol.MessageActionItem{
Title: action.Title,
})
}
selection, err = c.ideGateway.ShowMessageRequest(ctx, &showMessageRequestParams)
if err != nil {
// Ignore cancellation error caused by client disconnecting.
var rpcError *jsonrpc2.Error
if errors.As(err, &rpcError) &&
rpcError.Code == jsonrpc2.InternalError &&
rpcError.Message == "Request window/showMessageRequest failed with message: Canceled" {
return nil, nil
}
return nil, fmt.Errorf("show message request: %w", err)
}
if selection == nil {
return nil, nil
}
}
for _, action := range msg.Actions {
if selection.Title != action.Title {
continue
}
if action.Save {
if err := c.markMessageAsShown(msg, selection); err != nil {
return nil, fmt.Errorf("mark message as shown: %w", err)
}
}
if action.URI == "" {
return &action, nil
}
if _, err = c.ideGateway.ShowDocument(ctx, &protocol.ShowDocumentParams{
URI: protocol.URI(action.URI),
External: action.External,
TakeFocus: true,
}); err != nil {
return &action, fmt.Errorf("show document: %w", err)
}
return &action, nil
}
return nil, fmt.Errorf("no action matches selection '%s'", selection.Title)
}