mirror of
https://github.com/Myzel394/config-lsp.git
synced 2025-06-18 15:05:28 +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(
|
||||
t *testing.T,
|
||||
) {
|
||||
|
@ -147,6 +147,10 @@ func (c SSHConfig) FindOption(line uint32) (*SSHOption, SSHBlock) {
|
||||
option = rawOption.(*SSHOption)
|
||||
}
|
||||
} else {
|
||||
if line == block.GetLocation().Start.Line {
|
||||
return block.GetEntryOption(), block
|
||||
}
|
||||
|
||||
if rawOption, found := block.GetOptions().Get(line); found {
|
||||
option = rawOption.(*SSHOption)
|
||||
}
|
||||
|
@ -1 +1,28 @@
|
||||
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" {
|
||||
return nil, nil
|
||||
// return getMatchCompletions(
|
||||
// d,
|
||||
// cursor,
|
||||
// matchBlock.MatchValue,
|
||||
// )
|
||||
matchBlock := block.(*ast.SSHMatchBlock)
|
||||
return getMatchCompletions(
|
||||
d,
|
||||
cursor,
|
||||
matchBlock.MatchValue,
|
||||
)
|
||||
}
|
||||
|
||||
if entry.OptionValue == nil {
|
||||
|
@ -3,8 +3,9 @@ package handlers
|
||||
import (
|
||||
"config-lsp/common"
|
||||
sshconfig "config-lsp/handlers/ssh_config"
|
||||
"config-lsp/handlers/ssh_config/fields"
|
||||
matchparser "config-lsp/handlers/ssh_config/match-parser"
|
||||
"config-lsp/handlers/sshd_config/fields"
|
||||
|
||||
protocol "github.com/tliron/glsp/protocol_3_16"
|
||||
)
|
||||
|
||||
@ -103,20 +104,20 @@ func getMatchValueCompletions(
|
||||
}
|
||||
|
||||
switch entry.Criteria.Type {
|
||||
case matchparser.MatchCriteriaTypeUser:
|
||||
return fields.MatchUserField.DeprecatedFetchCompletions(line, relativeCursor)
|
||||
case matchparser.MatchCriteriaTypeGroup:
|
||||
return fields.MatchGroupField.DeprecatedFetchCompletions(line, relativeCursor)
|
||||
case matchparser.MatchCriteriaTypeExec:
|
||||
return fields.MatchExecField.DeprecatedFetchCompletions(line, relativeCursor)
|
||||
case matchparser.MatchCriteriaTypeLocalNetwork:
|
||||
return fields.MatchLocalNetworkField.DeprecatedFetchCompletions(line, relativeCursor)
|
||||
case matchparser.MatchCriteriaTypeHost:
|
||||
return fields.MatchHostField.DeprecatedFetchCompletions(line, relativeCursor)
|
||||
case matchparser.MatchCriteriaTypeAddress:
|
||||
return fields.MatchAddressField.DeprecatedFetchCompletions(line, relativeCursor)
|
||||
case matchparser.MatchCriteriaTypeLocalAddress:
|
||||
return fields.MatchLocalAddressField.DeprecatedFetchCompletions(line, relativeCursor)
|
||||
case matchparser.MatchCriteriaTypeLocalPort:
|
||||
return fields.MatchLocalPortField.DeprecatedFetchCompletions(line, relativeCursor)
|
||||
case matchparser.MatchCriteriaTypeRDomain:
|
||||
return fields.MatchRDomainField.DeprecatedFetchCompletions(line, relativeCursor)
|
||||
case matchparser.MatchCriteriaTypeOriginalHost:
|
||||
return fields.MatchOriginalHostField.DeprecatedFetchCompletions(line, relativeCursor)
|
||||
case matchparser.MatchCriteriaTypeTagged:
|
||||
return fields.MatchTypeTaggedField.DeprecatedFetchCompletions(line, relativeCursor)
|
||||
case matchparser.MatchCriteriaTypeUser:
|
||||
return fields.MatchUserField.DeprecatedFetchCompletions(line, relativeCursor)
|
||||
case matchparser.MatchCriteriaTypeLocalUser:
|
||||
return fields.MatchTypeLocalUserField.DeprecatedFetchCompletions(line, relativeCursor)
|
||||
}
|
||||
|
||||
return nil
|
||||
|
Loading…
x
Reference in New Issue
Block a user