mirror of
https://github.com/turbot/steampipe.git
synced 2025-12-20 02:20:57 -05:00
52 lines
1.3 KiB
Go
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
|
|
}
|