func()

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)
}