mirror of https://github.com/hashicorp/consul
99 lines
1.8 KiB
Go
99 lines
1.8 KiB
Go
// Copyright (c) HashiCorp, Inc.
|
|
// SPDX-License-Identifier: BUSL-1.1
|
|
|
|
package tfgen
|
|
|
|
import (
|
|
"bytes"
|
|
"text/template"
|
|
|
|
"github.com/hashicorp/go-hclog"
|
|
"github.com/hashicorp/hcl/v2/hclwrite"
|
|
)
|
|
|
|
type FileResource struct {
|
|
name string
|
|
res Resource
|
|
}
|
|
|
|
func (r *FileResource) Name() string { return r.name }
|
|
|
|
func (r *FileResource) Commit(logger hclog.Logger) error {
|
|
val, err := r.res.Render()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
_, err = UpdateFileIfDifferent(logger, []byte(val), r.name, 0644)
|
|
return err
|
|
}
|
|
|
|
func File(name string, res Resource) *FileResource {
|
|
return &FileResource{name: name, res: res}
|
|
}
|
|
|
|
func Text(s string) Resource {
|
|
return &textResource{text: s}
|
|
}
|
|
|
|
func Embed(name string) Resource {
|
|
return &embedResource{name: name}
|
|
}
|
|
|
|
func Eval(t *template.Template, data any) Resource {
|
|
return &evalResource{template: t, data: data, hcl: false}
|
|
}
|
|
|
|
func HCL(t *template.Template, data any) Resource {
|
|
return &evalResource{template: t, data: data, hcl: true}
|
|
}
|
|
|
|
type Resource interface {
|
|
Render() (string, error)
|
|
}
|
|
|
|
type embedResource struct {
|
|
name string
|
|
}
|
|
|
|
func (r *embedResource) Render() (string, error) {
|
|
val, err := content.ReadFile(r.name)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
return string(val), nil
|
|
}
|
|
|
|
type textResource struct {
|
|
text string
|
|
}
|
|
|
|
func (r *textResource) Render() (string, error) {
|
|
return r.text, nil
|
|
}
|
|
|
|
type evalResource struct {
|
|
template *template.Template
|
|
data any
|
|
hcl bool
|
|
}
|
|
|
|
func (r *evalResource) Render() (string, error) {
|
|
out, err := StringTemplate(r.template, r.data)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
|
|
if r.hcl {
|
|
return string(hclwrite.Format([]byte(out))), nil
|
|
}
|
|
return out, nil
|
|
}
|
|
|
|
func StringTemplate(t *template.Template, data any) (string, error) {
|
|
var res bytes.Buffer
|
|
if err := t.Execute(&res, data); err != nil {
|
|
return "", err
|
|
}
|
|
return res.String(), nil
|
|
}
|