/
datasourceWrapper.go
86 lines (68 loc) · 2.62 KB
/
datasourceWrapper.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
package datasource
import (
"context"
"fmt"
"github.com/PGSSoft/terraform-provider-mssql/internal/core"
"github.com/PGSSoft/terraform-provider-mssql/internal/utils"
"github.com/hashicorp/terraform-plugin-framework/datasource"
"github.com/hashicorp/terraform-plugin-framework/diag"
"github.com/hashicorp/terraform-plugin-framework/tfsdk"
)
var _ datasource.DataSourceWithValidateConfig = &dataSourceWrapper[any]{}
func NewDataSource[T any](d DataSource[T]) func() datasource.DataSourceWithConfigure {
return func() datasource.DataSourceWithConfigure {
return &dataSourceWrapper[T]{d: d}
}
}
type dataSourceWrapper[T any] struct {
d DataSource[T]
ctx core.ResourceContext
}
func (d *dataSourceWrapper[T]) Metadata(_ context.Context, req datasource.MetadataRequest, resp *datasource.MetadataResponse) {
resp.TypeName = fmt.Sprintf("%s_%s", req.ProviderTypeName, d.d.GetName())
}
func (d *dataSourceWrapper[T]) Configure(_ context.Context, req datasource.ConfigureRequest, resp *datasource.ConfigureResponse) {
if req.ProviderData == nil {
return
}
resourceCtx, ok := req.ProviderData.(core.ResourceContext)
if !ok {
resp.Diagnostics.AddError(
"Unexpected data source configure type",
fmt.Sprintf("Expected ResourceContext, got: %T. Please report this issue to the provider developers.", req.ProviderData))
return
}
d.ctx = resourceCtx
}
func (d *dataSourceWrapper[T]) GetSchema(ctx context.Context) (tfsdk.Schema, diag.Diagnostics) {
diags := diag.Diagnostics{}
return d.d.GetSchema(utils.WithDiagnostics(ctx, &diags)), diags
}
func (d *dataSourceWrapper[T]) Read(ctx context.Context, req datasource.ReadRequest, resp *datasource.ReadResponse) {
ctx = utils.WithDiagnostics(ctx, &resp.Diagnostics)
request := ReadRequest[T]{}
request.monad = utils.StopOnError(ctx).
Then(func() { request.Conn = d.ctx.ConnFactory(ctx) }).
Then(func() { request.Config = utils.GetData[T](ctx, req.Config) })
response := ReadResponse[T]{}
d.d.Read(ctx, request, &response)
request.monad.Then(func() {
if response.exists {
utils.SetData(ctx, &resp.State, response.state)
} else {
resp.State.RemoveResource(ctx)
}
})
}
func (d *dataSourceWrapper[T]) ValidateConfig(ctx context.Context, req datasource.ValidateConfigRequest, resp *datasource.ValidateConfigResponse) {
dsWithValidation, ok := d.d.(DataSourceWithValidation[T])
if !ok {
return
}
ctx = utils.WithDiagnostics(ctx, &resp.Diagnostics)
request := ValidateRequest[T]{}
request.monad = utils.StopOnError(ctx).
Then(func() { request.Config = utils.GetData[T](ctx, req.Config) })
response := ValidateResponse[T]{}
dsWithValidation.Validate(ctx, request, &response)
}