mirror of
https://github.com/outbackdingo/terraform-provider-util.git
synced 2026-01-27 10:20:41 +00:00
* It's conventional to implement Terraform providers within an internal package, since they're not intended to be consumed or relied upon as Go libraries
71 lines
1.6 KiB
Go
71 lines
1.6 KiB
Go
package internal
|
|
|
|
import (
|
|
"context"
|
|
"path/filepath"
|
|
|
|
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
|
|
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
|
|
"github.com/poseidon/terraform-provider-util/internal/nixane"
|
|
)
|
|
|
|
func datasourceNix() *schema.Resource {
|
|
return &schema.Resource{
|
|
ReadContext: datasourceNixRead,
|
|
|
|
Schema: map[string]*schema.Schema{
|
|
"name": {
|
|
Type: schema.TypeString,
|
|
Required: true,
|
|
},
|
|
"path": {
|
|
Type: schema.TypeString,
|
|
Optional: true,
|
|
},
|
|
"overlay": {
|
|
Type: schema.TypeMap,
|
|
Optional: true,
|
|
Elem: schema.TypeString,
|
|
},
|
|
"rendered": {
|
|
Type: schema.TypeString,
|
|
Computed: true,
|
|
Description: "render merged modules",
|
|
},
|
|
},
|
|
}
|
|
}
|
|
|
|
func datasourceNixRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
|
|
var diags diag.Diagnostics
|
|
|
|
rendered, err := renderContent(d)
|
|
if err != nil {
|
|
return diag.FromErr(err)
|
|
}
|
|
|
|
if err := d.Set("rendered", rendered); err != nil {
|
|
return diag.FromErr(err)
|
|
}
|
|
d.SetId(Hashcode(rendered))
|
|
return diags
|
|
}
|
|
|
|
func renderContent(d *schema.ResourceData) (string, error) {
|
|
// unchecked assertions seem to be the norm in Terraform :S
|
|
name := d.Get("name").(string)
|
|
path := d.Get("path").(string)
|
|
overlays := map[string]string{}
|
|
for k, v := range d.Get("overlay").(map[string]interface{}) {
|
|
overlays[k] = v.(string)
|
|
}
|
|
path = filepath.Clean(path)
|
|
|
|
fsys := nixane.NewOverlayFS(overlays)
|
|
modules, err := nixane.CollectModules(fsys, path)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
return nixane.EncodeToAwkball(name, modules), nil
|
|
}
|