feat(ssh_config): Add completions for match option

This commit is contained in:
Myzel394 2024-09-29 17:44:33 +02:00
parent ac1d14dfd0
commit 3afcf4c27b
No known key found for this signature in database
GPG Key ID: DEC4AAB876F73185
5 changed files with 117 additions and 19 deletions

View File

@ -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,
) { ) {

View File

@ -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)
} }

View File

@ -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,
}

View File

@ -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 {

View File

@ -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