]> git.immae.eu Git - github/fretlink/terraform-provider-statuscake.git/blobdiff - vendor/github.com/hashicorp/terraform/helper/shadow/closer.go
deps: use go modules for dep mgmt
[github/fretlink/terraform-provider-statuscake.git] / vendor / github.com / hashicorp / terraform / helper / shadow / closer.go
index 7edd5e75db399561ac18a2396769e0dbad4cb2a1..edc1e2a93016bed9238b1d15a7e45007629dc153 100644 (file)
@@ -39,6 +39,8 @@ func (w *closeWalker) Struct(reflect.Value) error {
        return nil
 }
 
+var closerType = reflect.TypeOf((*io.Closer)(nil)).Elem()
+
 func (w *closeWalker) StructField(f reflect.StructField, v reflect.Value) error {
        // Not sure why this would be but lets avoid some panics
        if !v.IsValid() {
@@ -56,17 +58,18 @@ func (w *closeWalker) StructField(f reflect.StructField, v reflect.Value) error
                return nil
        }
 
-       // We're looking for an io.Closer
-       raw := v.Interface()
-       if raw == nil {
-               return nil
+       var closer io.Closer
+       if v.Type().Implements(closerType) {
+               closer = v.Interface().(io.Closer)
+       } else if v.CanAddr() {
+               // The Close method may require a pointer receiver, but we only have a value.
+               v := v.Addr()
+               if v.Type().Implements(closerType) {
+                       closer = v.Interface().(io.Closer)
+               }
        }
 
-       closer, ok := raw.(io.Closer)
-       if !ok && v.CanAddr() {
-               closer, ok = v.Addr().Interface().(io.Closer)
-       }
-       if !ok {
+       if closer == nil {
                return reflectwalk.SkipEntry
        }