1package chat
2
3import (
4 "encoding/json"
5
6 "github.com/charmbracelet/crush/internal/agent/tools"
7 "github.com/charmbracelet/crush/internal/message"
8 "github.com/charmbracelet/crush/internal/ui/styles"
9)
10
11// LSPRestartToolMessageItem is a message item that represents a lsprestart tool call.
12type LSPRestartToolMessageItem struct {
13 *baseToolMessageItem
14}
15
16var _ ToolMessageItem = (*LSPRestartToolMessageItem)(nil)
17
18// NewLSPRestartToolMessageItem creates a new [LSPRestartToolMessageItem].
19func NewLSPRestartToolMessageItem(
20 sty *styles.Styles,
21 toolCall message.ToolCall,
22 result *message.ToolResult,
23 canceled bool,
24) ToolMessageItem {
25 return newBaseToolMessageItem(sty, toolCall, result, &LSPRestartToolRenderContext{}, canceled)
26}
27
28// LSPRestartToolRenderContext renders lsprestart tool messages.
29type LSPRestartToolRenderContext struct{}
30
31// RenderTool implements the [ToolRenderer] interface.
32func (r *LSPRestartToolRenderContext) RenderTool(sty *styles.Styles, width int, opts *ToolRenderOpts) string {
33 cappedWidth := cappedMessageWidth(width)
34 if opts.IsPending() {
35 return pendingTool(sty, "Restart LSP", opts.Anim)
36 }
37
38 var params tools.LSPRestartParams
39 _ = json.Unmarshal([]byte(opts.ToolCall.Input), ¶ms)
40
41 var toolParams []string
42 if params.Name != "" {
43 toolParams = append(toolParams, params.Name)
44 }
45
46 header := toolHeader(sty, opts.Status, "Restart LSP", cappedWidth, opts.Compact, toolParams...)
47 if opts.Compact {
48 return header
49 }
50
51 if earlyState, ok := toolEarlyStateContent(sty, opts, cappedWidth); ok {
52 return joinToolParts(header, earlyState)
53 }
54
55 if opts.HasEmptyResult() {
56 return header
57 }
58
59 bodyWidth := cappedWidth - toolBodyLeftPaddingTotal
60 body := sty.Tool.Body.Render(toolOutputPlainContent(sty, opts.Result.Content, bodyWidth, opts.ExpandedContent))
61 return joinToolParts(header, body)
62}