]> git.immae.eu Git - github/fretlink/terraform-provider-statuscake.git/blob - vendor/github.com/hashicorp/terraform/helper/schema/data_source_resource_shim.go
Merge pull request #34 from jcalonso/fix/contact-group-backwards-compatible
[github/fretlink/terraform-provider-statuscake.git] / vendor / github.com / hashicorp / terraform / helper / schema / data_source_resource_shim.go
1 package schema
2
3 import (
4 "fmt"
5 )
6
7 // DataSourceResourceShim takes a Resource instance describing a data source
8 // (with a Read implementation and a Schema, at least) and returns a new
9 // Resource instance with additional Create and Delete implementations that
10 // allow the data source to be used as a resource.
11 //
12 // This is a backward-compatibility layer for data sources that were formerly
13 // read-only resources before the data source concept was added. It should not
14 // be used for any *new* data sources.
15 //
16 // The Read function for the data source *must* call d.SetId with a non-empty
17 // id in order for this shim to function as expected.
18 //
19 // The provided Resource instance, and its schema, will be modified in-place
20 // to make it suitable for use as a full resource.
21 func DataSourceResourceShim(name string, dataSource *Resource) *Resource {
22 // Recursively, in-place adjust the schema so that it has ForceNew
23 // on any user-settable resource.
24 dataSourceResourceShimAdjustSchema(dataSource.Schema)
25
26 dataSource.Create = CreateFunc(dataSource.Read)
27 dataSource.Delete = func(d *ResourceData, meta interface{}) error {
28 d.SetId("")
29 return nil
30 }
31 dataSource.Update = nil // should already be nil, but let's make sure
32
33 // FIXME: Link to some further docs either on the website or in the
34 // changelog, once such a thing exists.
35 dataSource.DeprecationMessage = fmt.Sprintf(
36 "using %s as a resource is deprecated; consider using the data source instead",
37 name,
38 )
39
40 return dataSource
41 }
42
43 func dataSourceResourceShimAdjustSchema(schema map[string]*Schema) {
44 for _, s := range schema {
45 // If the attribute is configurable then it must be ForceNew,
46 // since we have no Update implementation.
47 if s.Required || s.Optional {
48 s.ForceNew = true
49 }
50
51 // If the attribute is a nested resource, we need to recursively
52 // apply these same adjustments to it.
53 if s.Elem != nil {
54 if r, ok := s.Elem.(*Resource); ok {
55 dataSourceResourceShimAdjustSchema(r.Schema)
56 }
57 }
58 }
59 }