driftctl/pkg/terraform/lock/lockfile.go

59 lines
1.2 KiB
Go

package lock
import (
"strings"
"github.com/hashicorp/hcl/v2/gohcl"
"github.com/hashicorp/hcl/v2/hclparse"
)
type ProviderBlock struct {
Address string `hcl:"address,label"`
Version string `hcl:"version,attr"`
Constraints string `hcl:"constraints,optional"`
Hashes []string `hcl:"hashes,optional"`
}
// ProviderAddress encapsulates a single provider type. In the future this will be
// extended to include additional fields including Namespace and SourceHost
type ProviderAddress struct {
Type string
Namespace string
Hostname string
}
func (p *ProviderAddress) String() string {
return strings.Join([]string{p.Hostname, p.Namespace, p.Type}, "/")
}
type Lockfile struct {
Providers []ProviderBlock `hcl:"provider,block"`
}
func (l *Lockfile) GetProviderByAddress(addr *ProviderAddress) *ProviderBlock {
for _, p := range l.Providers {
if p.Address == addr.String() {
return &p
}
}
return nil
}
func ReadLocksFromFile(filename string) (*Lockfile, error) {
var lock Lockfile
parser := hclparse.NewParser()
f, diags := parser.ParseHCLFile(filename)
if diags.HasErrors() {
return &lock, diags
}
diags = gohcl.DecodeBody(f.Body, nil, &lock)
if diags.HasErrors() {
return &lock, diags
}
return &lock, nil
}