mirror of
https://github.com/Myzel394/config-lsp.git
synced 2025-06-18 23:15:26 +02:00
feat(ssh_config): Add completions for match option
This commit is contained in:
parent
ac1d14dfd0
commit
3afcf4c27b
@ -257,6 +257,72 @@ Match originalhost laptop exec "[[ $(/usr/bin/dig +short laptop.lan) == '' ]]"
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestIncompleteExample(
|
||||||
|
t *testing.T,
|
||||||
|
) {
|
||||||
|
input := utils.Dedent(`
|
||||||
|
User
|
||||||
|
`)
|
||||||
|
p := NewSSHConfig()
|
||||||
|
|
||||||
|
errors := p.Parse(input)
|
||||||
|
|
||||||
|
if len(errors) > 0 {
|
||||||
|
t.Fatalf("Expected no errors, got %v", errors)
|
||||||
|
}
|
||||||
|
|
||||||
|
if !(p.Options.Size() == 1) {
|
||||||
|
t.Errorf("Expected 1 option, but got: %v", p.Options.Size())
|
||||||
|
}
|
||||||
|
|
||||||
|
if !(len(utils.KeysOfMap(p.CommentLines)) == 0) {
|
||||||
|
t.Errorf("Expected no comment lines, but got: %v", len(p.CommentLines))
|
||||||
|
}
|
||||||
|
|
||||||
|
rawFirstEntry, _ := p.Options.Get(uint32(0))
|
||||||
|
firstEntry := rawFirstEntry.(*SSHOption)
|
||||||
|
if !(firstEntry.Value.Raw == "User " && firstEntry.Key.Value.Raw == "User") {
|
||||||
|
t.Errorf("Expected first entry to be User, but got: %v", firstEntry)
|
||||||
|
}
|
||||||
|
|
||||||
|
if !(firstEntry.OptionValue != nil && firstEntry.OptionValue.Value.Raw == "") {
|
||||||
|
t.Errorf("Expected first entry to have an empty value, but got: %v", firstEntry)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestIncompleteMatch(
|
||||||
|
t *testing.T,
|
||||||
|
) {
|
||||||
|
input := utils.Dedent(`
|
||||||
|
Match
|
||||||
|
`)
|
||||||
|
p := NewSSHConfig()
|
||||||
|
|
||||||
|
errors := p.Parse(input)
|
||||||
|
|
||||||
|
if len(errors) > 0 {
|
||||||
|
t.Fatalf("Expected no errors, got %v", errors)
|
||||||
|
}
|
||||||
|
|
||||||
|
if !(p.Options.Size() == 1) {
|
||||||
|
t.Errorf("Expected 1 option, but got: %v", p.Options.Size())
|
||||||
|
}
|
||||||
|
|
||||||
|
if !(len(utils.KeysOfMap(p.CommentLines)) == 0) {
|
||||||
|
t.Errorf("Expected no comment lines, but got: %v", len(p.CommentLines))
|
||||||
|
}
|
||||||
|
|
||||||
|
rawFirstEntry, _ := p.Options.Get(uint32(0))
|
||||||
|
firstEntry := rawFirstEntry.(*SSHMatchBlock)
|
||||||
|
if !(firstEntry.MatchOption.Key.Value.Raw == "Match") {
|
||||||
|
t.Errorf("Expected first entry to be User, but got: %v", firstEntry)
|
||||||
|
}
|
||||||
|
|
||||||
|
if !(firstEntry.MatchOption.OptionValue != nil && firstEntry.MatchOption.OptionValue.Value.Raw == "") {
|
||||||
|
t.Errorf("Expected first entry to have an empty value, but got: %v", firstEntry)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func TestComplexBigExample(
|
func TestComplexBigExample(
|
||||||
t *testing.T,
|
t *testing.T,
|
||||||
) {
|
) {
|
||||||
|
@ -147,6 +147,10 @@ func (c SSHConfig) FindOption(line uint32) (*SSHOption, SSHBlock) {
|
|||||||
option = rawOption.(*SSHOption)
|
option = rawOption.(*SSHOption)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
if line == block.GetLocation().Start.Line {
|
||||||
|
return block.GetEntryOption(), block
|
||||||
|
}
|
||||||
|
|
||||||
if rawOption, found := block.GetOptions().Get(line); found {
|
if rawOption, found := block.GetOptions().Get(line); found {
|
||||||
option = rawOption.(*SSHOption)
|
option = rawOption.(*SSHOption)
|
||||||
}
|
}
|
||||||
|
@ -1 +1,28 @@
|
|||||||
package fields
|
package fields
|
||||||
|
|
||||||
|
import (
|
||||||
|
docvalues "config-lsp/doc-values"
|
||||||
|
matchparser "config-lsp/handlers/ssh_config/match-parser"
|
||||||
|
)
|
||||||
|
|
||||||
|
var MatchExecField = docvalues.StringValue{}
|
||||||
|
var MatchLocalNetworkField = docvalues.IPAddressValue{
|
||||||
|
AllowIPv4: true,
|
||||||
|
AllowIPv6: true,
|
||||||
|
AllowRange: false,
|
||||||
|
}
|
||||||
|
var MatchHostField = docvalues.StringValue{}
|
||||||
|
var MatchOriginalHostField = docvalues.StringValue{}
|
||||||
|
var MatchTypeTaggedField = docvalues.StringValue{}
|
||||||
|
var MatchUserField = docvalues.UserValue("", false)
|
||||||
|
var MatchTypeLocalUserField = docvalues.UserValue("", false)
|
||||||
|
|
||||||
|
var MatchValueFieldMap = map[matchparser.MatchCriteriaType]docvalues.DeprecatedValue{
|
||||||
|
matchparser.MatchCriteriaTypeExec: MatchExecField,
|
||||||
|
matchparser.MatchCriteriaTypeLocalNetwork: MatchLocalNetworkField,
|
||||||
|
matchparser.MatchCriteriaTypeHost: MatchHostField,
|
||||||
|
matchparser.MatchCriteriaTypeOriginalHost: MatchOriginalHostField,
|
||||||
|
matchparser.MatchCriteriaTypeTagged: MatchTypeTaggedField,
|
||||||
|
matchparser.MatchCriteriaTypeUser: MatchUserField,
|
||||||
|
matchparser.MatchCriteriaTypeLocalUser: MatchTypeLocalUserField,
|
||||||
|
}
|
||||||
|
@ -72,12 +72,12 @@ func GetOptionCompletions(
|
|||||||
}
|
}
|
||||||
|
|
||||||
if entry.Key.Key == "Match" {
|
if entry.Key.Key == "Match" {
|
||||||
return nil, nil
|
matchBlock := block.(*ast.SSHMatchBlock)
|
||||||
// return getMatchCompletions(
|
return getMatchCompletions(
|
||||||
// d,
|
d,
|
||||||
// cursor,
|
cursor,
|
||||||
// matchBlock.MatchValue,
|
matchBlock.MatchValue,
|
||||||
// )
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
if entry.OptionValue == nil {
|
if entry.OptionValue == nil {
|
||||||
|
@ -3,8 +3,9 @@ package handlers
|
|||||||
import (
|
import (
|
||||||
"config-lsp/common"
|
"config-lsp/common"
|
||||||
sshconfig "config-lsp/handlers/ssh_config"
|
sshconfig "config-lsp/handlers/ssh_config"
|
||||||
|
"config-lsp/handlers/ssh_config/fields"
|
||||||
matchparser "config-lsp/handlers/ssh_config/match-parser"
|
matchparser "config-lsp/handlers/ssh_config/match-parser"
|
||||||
"config-lsp/handlers/sshd_config/fields"
|
|
||||||
protocol "github.com/tliron/glsp/protocol_3_16"
|
protocol "github.com/tliron/glsp/protocol_3_16"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -103,20 +104,20 @@ func getMatchValueCompletions(
|
|||||||
}
|
}
|
||||||
|
|
||||||
switch entry.Criteria.Type {
|
switch entry.Criteria.Type {
|
||||||
case matchparser.MatchCriteriaTypeUser:
|
case matchparser.MatchCriteriaTypeExec:
|
||||||
return fields.MatchUserField.DeprecatedFetchCompletions(line, relativeCursor)
|
return fields.MatchExecField.DeprecatedFetchCompletions(line, relativeCursor)
|
||||||
case matchparser.MatchCriteriaTypeGroup:
|
case matchparser.MatchCriteriaTypeLocalNetwork:
|
||||||
return fields.MatchGroupField.DeprecatedFetchCompletions(line, relativeCursor)
|
return fields.MatchLocalNetworkField.DeprecatedFetchCompletions(line, relativeCursor)
|
||||||
case matchparser.MatchCriteriaTypeHost:
|
case matchparser.MatchCriteriaTypeHost:
|
||||||
return fields.MatchHostField.DeprecatedFetchCompletions(line, relativeCursor)
|
return fields.MatchHostField.DeprecatedFetchCompletions(line, relativeCursor)
|
||||||
case matchparser.MatchCriteriaTypeAddress:
|
case matchparser.MatchCriteriaTypeOriginalHost:
|
||||||
return fields.MatchAddressField.DeprecatedFetchCompletions(line, relativeCursor)
|
return fields.MatchOriginalHostField.DeprecatedFetchCompletions(line, relativeCursor)
|
||||||
case matchparser.MatchCriteriaTypeLocalAddress:
|
case matchparser.MatchCriteriaTypeTagged:
|
||||||
return fields.MatchLocalAddressField.DeprecatedFetchCompletions(line, relativeCursor)
|
return fields.MatchTypeTaggedField.DeprecatedFetchCompletions(line, relativeCursor)
|
||||||
case matchparser.MatchCriteriaTypeLocalPort:
|
case matchparser.MatchCriteriaTypeUser:
|
||||||
return fields.MatchLocalPortField.DeprecatedFetchCompletions(line, relativeCursor)
|
return fields.MatchUserField.DeprecatedFetchCompletions(line, relativeCursor)
|
||||||
case matchparser.MatchCriteriaTypeRDomain:
|
case matchparser.MatchCriteriaTypeLocalUser:
|
||||||
return fields.MatchRDomainField.DeprecatedFetchCompletions(line, relativeCursor)
|
return fields.MatchTypeLocalUserField.DeprecatedFetchCompletions(line, relativeCursor)
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
|
Loading…
x
Reference in New Issue
Block a user