internal/provider/metadata_data_source.go (75 lines of code) (raw):
package provider
import (
"context"
"fmt"
"github.com/Azure/alzlib/to"
"github.com/Azure/terraform-provider-alz/internal/provider/gen"
"github.com/Azure/terraform-provider-alz/internal/typehelper/gotype"
"github.com/hashicorp/go-uuid"
"github.com/hashicorp/terraform-plugin-framework/datasource"
"github.com/hashicorp/terraform-plugin-framework/types"
)
var _ datasource.DataSource = (*metadataDataSource)(nil)
var _ datasource.DataSourceWithConfigure = (*metadataDataSource)(nil)
func NewMetadataDataSource() datasource.DataSource {
return &metadataDataSource{}
}
type metadataDataSource struct {
alz *alzProviderData
}
func (d *metadataDataSource) Metadata(ctx context.Context, req datasource.MetadataRequest, resp *datasource.MetadataResponse) {
resp.TypeName = req.ProviderTypeName + "_metadata"
}
func (d *metadataDataSource) Schema(ctx context.Context, req datasource.SchemaRequest, resp *datasource.SchemaResponse) {
resp.Schema = gen.MetadataDataSourceSchema(ctx)
}
func (d *metadataDataSource) Configure(ctx context.Context, req datasource.ConfigureRequest, resp *datasource.ConfigureResponse) {
// Prevent panic if the provider has not been configured.
if req.ProviderData == nil {
return
}
data, ok := req.ProviderData.(*alzProviderData)
if !ok {
resp.Diagnostics.AddError(
"metadataDataSource.Configure() Unexpected type",
fmt.Sprintf("Expected *alzProviderData, got: %T. Please report this issue to the provider developers.", req.ProviderData),
)
return
}
d.alz = data
}
func (d *metadataDataSource) Read(ctx context.Context, req datasource.ReadRequest, resp *datasource.ReadResponse) {
var data gen.MetadataModel
// Read Terraform configuration data into the model
resp.Diagnostics.Append(req.Config.Get(ctx, &data)...)
if resp.Diagnostics.HasError() {
return
}
if d.alz == nil {
resp.Diagnostics.AddError(
"metadataDataSource.Read() Provider not configured",
"The provider has not been configured. Please see the provider documentation for configuration instructions.",
)
return
}
if data.Id.IsNull() || data.Id.IsUnknown() {
u, err := uuid.GenerateUUID()
if err != nil {
resp.Diagnostics.AddError(
"metadataDataSource.Read() UUID generation failed",
fmt.Sprintf("Failed to generate UUID: %s", err),
)
return
}
data.Id = types.StringValue(u)
}
alzMeta := d.alz.Metadata()
alzRefs := make([]string, 0, len(alzMeta))
for _, ref := range alzMeta {
if !ref.IsAlzLibraryRef() {
continue
}
alzRefs = append(alzRefs, ref.Ref().String())
}
alzRefsAttrVal := gotype.SliceOfPrimitiveToFramework(ctx, to.SliceOfPtrs(alzRefs...))
data.AlzLibraryReferences = types.ListValueMust(types.StringType, alzRefsAttrVal)
resp.Diagnostics.Append(resp.State.Set(ctx, &data)...)
}