mirror of
https://github.com/Myzel394/config-lsp.git
synced 2025-06-18 23:15:26 +02:00
feat(wireguard): Add hover support
This commit is contained in:
parent
2a809a7d4c
commit
6bbf83c794
95
handlers/wireguard/hover.go
Normal file
95
handlers/wireguard/hover.go
Normal file
@ -0,0 +1,95 @@
|
|||||||
|
package wireguard
|
||||||
|
|
||||||
|
import (
|
||||||
|
docvalues "config-lsp/doc-values"
|
||||||
|
"fmt"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
func (p wireguardProperty) getHoverInfo(cursor uint32, section *wireguardSection) []string {
|
||||||
|
if cursor <= p.Key.Location.End {
|
||||||
|
options, found := optionsHeaderMap[*section.Name]
|
||||||
|
|
||||||
|
if !found {
|
||||||
|
return []string{}
|
||||||
|
}
|
||||||
|
|
||||||
|
option, found := options[p.Key.Name]
|
||||||
|
|
||||||
|
if !found {
|
||||||
|
return []string{}
|
||||||
|
}
|
||||||
|
|
||||||
|
return strings.Split(option.Documentation, "\n")
|
||||||
|
}
|
||||||
|
|
||||||
|
options, found := optionsHeaderMap[*section.Name]
|
||||||
|
|
||||||
|
if !found {
|
||||||
|
return []string{}
|
||||||
|
}
|
||||||
|
|
||||||
|
if option, found := options[p.Key.Name]; found {
|
||||||
|
return option.GetTypeDescription()
|
||||||
|
}
|
||||||
|
|
||||||
|
return []string{}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p wireguardParser) getHeaderInfo(line uint32, cursor uint32) []string {
|
||||||
|
section := p.getSectionByLine(line)
|
||||||
|
|
||||||
|
if section == nil {
|
||||||
|
return []string{}
|
||||||
|
}
|
||||||
|
|
||||||
|
sectionInfo := section.getHeaderInfo()
|
||||||
|
|
||||||
|
property, _ := section.findProperty(line)
|
||||||
|
|
||||||
|
if property == nil {
|
||||||
|
return sectionInfo
|
||||||
|
}
|
||||||
|
|
||||||
|
propertyInfo := property.getHoverInfo(cursor, section)
|
||||||
|
|
||||||
|
if len(propertyInfo) == 0 {
|
||||||
|
return sectionInfo
|
||||||
|
}
|
||||||
|
|
||||||
|
contents := append(sectionInfo, []string{
|
||||||
|
"",
|
||||||
|
fmt.Sprintf("### %s", property.Key.Name),
|
||||||
|
}...)
|
||||||
|
contents = append(contents, propertyInfo...)
|
||||||
|
|
||||||
|
return contents
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p wireguardSection) getHeaderInfo() []string {
|
||||||
|
if p.Name == nil {
|
||||||
|
return []string{}
|
||||||
|
}
|
||||||
|
|
||||||
|
contents := []string{
|
||||||
|
fmt.Sprintf("## [%s]", *p.Name),
|
||||||
|
"",
|
||||||
|
}
|
||||||
|
|
||||||
|
var option *docvalues.EnumString = nil
|
||||||
|
|
||||||
|
switch *p.Name {
|
||||||
|
case "Interface":
|
||||||
|
option = &headerInterfaceEnum
|
||||||
|
case "Peer":
|
||||||
|
option = &headerPeerEnum
|
||||||
|
}
|
||||||
|
|
||||||
|
if option == nil {
|
||||||
|
return contents
|
||||||
|
}
|
||||||
|
|
||||||
|
contents = append(contents, strings.Split(option.Documentation, "\n")...)
|
||||||
|
|
||||||
|
return contents
|
||||||
|
}
|
38
handlers/wireguard/text-document-hover.go
Normal file
38
handlers/wireguard/text-document-hover.go
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
package wireguard
|
||||||
|
|
||||||
|
import (
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
"github.com/tliron/glsp"
|
||||||
|
protocol "github.com/tliron/glsp/protocol_3_16"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TextDocumentHover(
|
||||||
|
context *glsp.Context,
|
||||||
|
params *protocol.HoverParams,
|
||||||
|
) (*protocol.Hover, error) {
|
||||||
|
// cursor := params.Position.Character
|
||||||
|
|
||||||
|
parser := documentParserMap[params.TextDocument.URI]
|
||||||
|
|
||||||
|
switch parser.getTypeByLine(params.Position.Line) {
|
||||||
|
case LineTypeComment:
|
||||||
|
return nil, nil
|
||||||
|
case LineTypeEmpty:
|
||||||
|
return nil, nil
|
||||||
|
case LineTypeHeader:
|
||||||
|
fallthrough
|
||||||
|
case LineTypeProperty:
|
||||||
|
documentation := parser.getHeaderInfo(params.Position.Line, params.Position.Character)
|
||||||
|
|
||||||
|
hover := protocol.Hover{
|
||||||
|
Contents: protocol.MarkupContent{
|
||||||
|
Kind: protocol.MarkupKindMarkdown,
|
||||||
|
Value: strings.Join(documentation, "\n"),
|
||||||
|
},
|
||||||
|
}
|
||||||
|
return &hover, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil, nil
|
||||||
|
}
|
@ -33,6 +33,16 @@ type wireguardParser struct {
|
|||||||
LineIndexes map[uint32]wireguardLineIndex
|
LineIndexes map[uint32]wireguardLineIndex
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (p *wireguardParser) getSectionByLine(line uint32) *wireguardSection {
|
||||||
|
for _, section := range p.Sections {
|
||||||
|
if section.StartLine <= line && section.EndLine >= line {
|
||||||
|
return section
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
// Search for a property by name
|
// Search for a property by name
|
||||||
// Returns (line number, property)
|
// Returns (line number, property)
|
||||||
func (p *wireguardParser) fetchPropertyByName(name string) (*uint32, *wireguardProperty) {
|
func (p *wireguardParser) fetchPropertyByName(name string) (*uint32, *wireguardProperty) {
|
||||||
|
@ -2,6 +2,7 @@ package roothandler
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"config-lsp/handlers/fstab"
|
"config-lsp/handlers/fstab"
|
||||||
|
"config-lsp/handlers/wireguard"
|
||||||
|
|
||||||
"github.com/tliron/glsp"
|
"github.com/tliron/glsp"
|
||||||
protocol "github.com/tliron/glsp/protocol_3_16"
|
protocol "github.com/tliron/glsp/protocol_3_16"
|
||||||
@ -15,6 +16,8 @@ func TextDocumentHover(context *glsp.Context, params *protocol.HoverParams) (*pr
|
|||||||
return fstab.TextDocumentHover(context, params)
|
return fstab.TextDocumentHover(context, params)
|
||||||
case LanguageSSHDConfig:
|
case LanguageSSHDConfig:
|
||||||
return nil, nil
|
return nil, nil
|
||||||
|
case LanguageWireguard:
|
||||||
|
return wireguard.TextDocumentHover(context, params)
|
||||||
}
|
}
|
||||||
|
|
||||||
panic("root-handler/TextDocumentHover: unexpected language" + language)
|
panic("root-handler/TextDocumentHover: unexpected language" + language)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user