Files
steampipe/pkg/parse/plugin.go
2025-03-06 16:34:18 +05:30

52 lines
1.3 KiB
Go

package parse
import (
"github.com/hashicorp/hcl/v2"
"github.com/hashicorp/hcl/v2/gohcl"
"github.com/hashicorp/hcl/v2/hclsyntax"
pparse "github.com/turbot/pipe-fittings/v2/parse"
"github.com/turbot/pipe-fittings/v2/plugin"
"github.com/turbot/pipe-fittings/v2/schema"
)
func DecodePlugin(block *hcl.Block) (*plugin.Plugin, hcl.Diagnostics) {
// manually decode child limiter blocks
content, rest, diags := block.Body.PartialContent(pparse.PluginBlockSchema)
if diags.HasErrors() {
return nil, diags
}
body := rest.(*hclsyntax.Body)
// decode attributes using 'rest' (these are automativally parsed so are not in schema)
var p = &plugin.Plugin{
// default source and name to label
Instance: block.Labels[0],
Alias: block.Labels[0],
}
moreDiags := gohcl.DecodeBody(body, &hcl.EvalContext{}, p)
if moreDiags.HasErrors() {
diags = append(diags, moreDiags...)
return nil, diags
}
// decode limiter blocks using 'content'
for _, block := range content.Blocks {
switch block.Type {
// only block defined in schema
case schema.BlockTypeRateLimiter:
limiter, moreDiags := pparse.DecodeLimiter(block)
diags = append(diags, moreDiags...)
if moreDiags.HasErrors() {
continue
}
limiter.SetPlugin(p)
p.Limiters = append(p.Limiters, limiter)
}
}
if !diags.HasErrors() {
p.OnDecoded(block)
}
return p, diags
}