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 if opts.IsPending() {
34 return pendingTool(sty, "Restart LSP", opts.Anim)
35 }
36
37 var params tools.LSPRestartParams
38 _ = json.Unmarshal([]byte(opts.ToolCall.Input), ¶ms)
39
40 toolParams := []string{}
41 if params.Name != "" {
42 toolParams = append(toolParams, params.Name)
43 }
44
45 header := toolHeader(sty, opts.Status, "Restart LSP", width, opts.Compact, toolParams...)
46 if opts.Compact {
47 return header
48 }
49
50 if earlyState, ok := toolEarlyStateContent(sty, opts, width); ok {
51 return joinToolParts(header, earlyState)
52 }
53
54 if opts.HasEmptyResult() {
55 return header
56 }
57
58 bodyWidth := width - toolBodyLeftPaddingTotal
59 body := sty.Tool.Body.Render(toolOutputPlainContent(sty, opts.Result.Content, bodyWidth, opts.ExpandedContent))
60 return joinToolParts(header, body)
61}