config-lsp/handlers/wireguard/code-actions.go

74 lines
1.6 KiB
Go

package wireguard
import (
protocol "github.com/tliron/glsp/protocol_3_16"
)
type codeActionName string
const (
codeActionGeneratePrivateKey codeActionName = "generatePrivateKey"
)
type codeActionGeneratePrivateKeyArgs struct {
URI protocol.DocumentUri
Line uint32
}
func codeActionGeneratePrivateKeyArgsFromArguments(arguments map[string]any) codeActionGeneratePrivateKeyArgs {
return codeActionGeneratePrivateKeyArgs{
URI: arguments["URI"].(protocol.DocumentUri),
Line: uint32(arguments["Line"].(float64)),
}
}
func (p wireguardProperty) getInsertRange(line uint32) protocol.Range {
insertPosition := p.Separator.Location.End
var length uint32 = 0
if p.Value != nil {
// Length of the value
length = p.Value.Location.End - p.Value.Location.Start
}
return protocol.Range{
Start: protocol.Position{
Line: line,
Character: insertPosition,
},
End: protocol.Position{
Line: line,
Character: insertPosition + length,
},
}
}
func (p *wireguardParser) runGeneratePrivateKey(args codeActionGeneratePrivateKeyArgs) (*protocol.ApplyWorkspaceEditParams, error) {
privateKey, err := createNewPrivateKey()
if err != nil {
return &protocol.ApplyWorkspaceEditParams{}, err
}
section, property := p.getPropertyByLine(args.Line)
if section == nil || property == nil {
return nil, nil
}
label := "Generate Private Key"
return &protocol.ApplyWorkspaceEditParams{
Label: &label,
Edit: protocol.WorkspaceEdit{
Changes: map[protocol.DocumentUri][]protocol.TextEdit{
args.URI: {
{
NewText: " " + privateKey,
Range: property.getInsertRange(args.Line),
},
},
},
},
}, nil
}