mirror of
https://github.com/opentffoundation/opentf.git
synced 2025-12-25 01:00:16 -05:00
internal/legacy/helper/schema
moving helper/schema into the ineternal/legacy tree
This commit is contained in:
59
internal/legacy/helper/schema/data_source_resource_shim.go
Normal file
59
internal/legacy/helper/schema/data_source_resource_shim.go
Normal file
@@ -0,0 +1,59 @@
|
||||
package schema
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
)
|
||||
|
||||
// DataSourceResourceShim takes a Resource instance describing a data source
|
||||
// (with a Read implementation and a Schema, at least) and returns a new
|
||||
// Resource instance with additional Create and Delete implementations that
|
||||
// allow the data source to be used as a resource.
|
||||
//
|
||||
// This is a backward-compatibility layer for data sources that were formerly
|
||||
// read-only resources before the data source concept was added. It should not
|
||||
// be used for any *new* data sources.
|
||||
//
|
||||
// The Read function for the data source *must* call d.SetId with a non-empty
|
||||
// id in order for this shim to function as expected.
|
||||
//
|
||||
// The provided Resource instance, and its schema, will be modified in-place
|
||||
// to make it suitable for use as a full resource.
|
||||
func DataSourceResourceShim(name string, dataSource *Resource) *Resource {
|
||||
// Recursively, in-place adjust the schema so that it has ForceNew
|
||||
// on any user-settable resource.
|
||||
dataSourceResourceShimAdjustSchema(dataSource.Schema)
|
||||
|
||||
dataSource.Create = CreateFunc(dataSource.Read)
|
||||
dataSource.Delete = func(d *ResourceData, meta interface{}) error {
|
||||
d.SetId("")
|
||||
return nil
|
||||
}
|
||||
dataSource.Update = nil // should already be nil, but let's make sure
|
||||
|
||||
// FIXME: Link to some further docs either on the website or in the
|
||||
// changelog, once such a thing exists.
|
||||
dataSource.DeprecationMessage = fmt.Sprintf(
|
||||
"using %s as a resource is deprecated; consider using the data source instead",
|
||||
name,
|
||||
)
|
||||
|
||||
return dataSource
|
||||
}
|
||||
|
||||
func dataSourceResourceShimAdjustSchema(schema map[string]*Schema) {
|
||||
for _, s := range schema {
|
||||
// If the attribute is configurable then it must be ForceNew,
|
||||
// since we have no Update implementation.
|
||||
if s.Required || s.Optional {
|
||||
s.ForceNew = true
|
||||
}
|
||||
|
||||
// If the attribute is a nested resource, we need to recursively
|
||||
// apply these same adjustments to it.
|
||||
if s.Elem != nil {
|
||||
if r, ok := s.Elem.(*Resource); ok {
|
||||
dataSourceResourceShimAdjustSchema(r.Schema)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user