mirror of
https://github.com/turbot/steampipe.git
synced 2026-02-18 04:00:20 -05:00
60 lines
1.6 KiB
Go
60 lines
1.6 KiB
Go
package parse
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
"github.com/hashicorp/hcl/v2"
|
|
"github.com/hashicorp/hcl/v2/gohcl"
|
|
"github.com/turbot/steampipe/pkg/steampipeconfig/options"
|
|
)
|
|
|
|
// DecodeOptions decodes an options block
|
|
func DecodeOptions(block *hcl.Block, overrides ...BlockMappingOverride) (options.Options, hcl.Diagnostics) {
|
|
var diags hcl.Diagnostics
|
|
mapping := defaultOptionsBlockMapping()
|
|
for _, applyOverride := range overrides {
|
|
applyOverride(mapping)
|
|
}
|
|
|
|
destination, ok := mapping[block.Labels[0]]
|
|
if !ok {
|
|
diags = append(diags, &hcl.Diagnostic{
|
|
Severity: hcl.DiagError,
|
|
Summary: fmt.Sprintf("Unexpected options type '%s'", block.Labels[0]),
|
|
Subject: &block.DefRange,
|
|
})
|
|
return nil, diags
|
|
}
|
|
|
|
diags = gohcl.DecodeBody(block.Body, nil, destination)
|
|
if diags.HasErrors() {
|
|
return nil, diags
|
|
}
|
|
|
|
return destination, nil
|
|
}
|
|
|
|
type OptionsBlockMapping = map[string]options.Options
|
|
|
|
func defaultOptionsBlockMapping() OptionsBlockMapping {
|
|
mapping := OptionsBlockMapping{
|
|
options.ConnectionBlock: &options.Connection{},
|
|
options.DatabaseBlock: &options.Database{},
|
|
options.TerminalBlock: &options.Terminal{},
|
|
options.GeneralBlock: &options.General{},
|
|
options.QueryBlock: &options.Query{},
|
|
options.CheckBlock: &options.Check{},
|
|
options.DashboardBlock: &options.GlobalDashboard{},
|
|
}
|
|
return mapping
|
|
}
|
|
|
|
type BlockMappingOverride func(OptionsBlockMapping)
|
|
|
|
// WithOverride overrides the default block mapping for a single block type
|
|
func WithOverride(blockName string, destination options.Options) BlockMappingOverride {
|
|
return func(mapping OptionsBlockMapping) {
|
|
mapping[blockName] = destination
|
|
}
|
|
}
|