config-lsp/handlers/ssh_config/document_fields.go

92 lines
2.1 KiB
Go

package sshconfig
import (
"config-lsp/handlers/ssh_config/ast"
"config-lsp/handlers/ssh_config/fields"
"config-lsp/utils"
)
func (d SSHDocument) FindOptionByNameAndBlock(
option fields.NormalizedOptionName,
block ast.SSHBlock,
) *ast.AllOptionInfo {
for _, info := range d.FindOptionsByName(option) {
if info.Block == block {
return &info
}
}
return nil
}
func (d SSHDocument) FindOptionsByName(
option fields.NormalizedOptionName,
) []ast.AllOptionInfo {
options := make([]ast.AllOptionInfo, 0, 5)
for _, info := range d.Config.GetAllOptions() {
if info.Option.Key.Key == option {
options = append(options, info)
}
}
return options
}
func (d SSHDocument) DoesOptionExist(
option fields.NormalizedOptionName,
block ast.SSHBlock,
) bool {
return d.FindOptionByNameAndBlock(option, block) != nil
}
var matchOption = fields.CreateNormalizedName("Match")
func (d SSHDocument) GetAllMatchBlocks() []*ast.SSHMatchBlock {
matchBlocks := make([]*ast.SSHMatchBlock, 0, 5)
options := d.Indexes.AllOptionsPerName[matchOption]
blocks := utils.KeysOfMap(options)
for _, block := range blocks {
matchBlocks = append(matchBlocks, block.(*ast.SSHMatchBlock))
}
return matchBlocks
}
var hostOption = fields.CreateNormalizedName("Host")
// GetAllHostBlocks: Returns all Host blocks.
// Note: This is not sorted
func (d SSHDocument) GetAllHostBlocks() []*ast.SSHHostBlock {
hostBlocks := make([]*ast.SSHHostBlock, 0, 5)
options := d.Indexes.AllOptionsPerName[hostOption]
blocks := utils.KeysOfMap(options)
for _, block := range blocks {
hostBlocks = append(hostBlocks, block.(*ast.SSHHostBlock))
}
return hostBlocks
}
// GetAllBlocks returns all blocks in the document
// Note: The blocks are **not** sorted
// Note: This also returns `nil` (as the global block)
func (d SSHDocument) GetAllBlocks() []ast.SSHBlock {
blocks := make([]ast.SSHBlock, 0)
blocks = append(blocks, nil)
for _, block := range d.GetAllHostBlocks() {
blocks = append(blocks, block)
}
for _, block := range d.GetAllMatchBlocks() {
blocks = append(blocks, block)
}
return blocks
}