github.com/opentofu/opentofu@v1.7.1/internal/command/jsonchecks/objects.go (about)

     1  // Copyright (c) The OpenTofu Authors
     2  // SPDX-License-Identifier: MPL-2.0
     3  // Copyright (c) 2023 HashiCorp, Inc.
     4  // SPDX-License-Identifier: MPL-2.0
     5  
     6  package jsonchecks
     7  
     8  import (
     9  	"fmt"
    10  
    11  	"github.com/opentofu/opentofu/internal/addrs"
    12  )
    13  
    14  type staticObjectAddr map[string]interface{}
    15  
    16  func makeStaticObjectAddr(addr addrs.ConfigCheckable) staticObjectAddr {
    17  	ret := map[string]interface{}{
    18  		"to_display": addr.String(),
    19  	}
    20  
    21  	switch addr := addr.(type) {
    22  	case addrs.ConfigResource:
    23  		if kind := addr.CheckableKind(); kind != addrs.CheckableResource {
    24  			// Something has gone very wrong
    25  			panic(fmt.Sprintf("%T has CheckableKind %s", addr, kind))
    26  		}
    27  
    28  		ret["kind"] = "resource"
    29  		switch addr.Resource.Mode {
    30  		case addrs.ManagedResourceMode:
    31  			ret["mode"] = "managed"
    32  		case addrs.DataResourceMode:
    33  			ret["mode"] = "data"
    34  		default:
    35  			panic(fmt.Sprintf("unsupported resource mode %#v", addr.Resource.Mode))
    36  		}
    37  		ret["type"] = addr.Resource.Type
    38  		ret["name"] = addr.Resource.Name
    39  		if !addr.Module.IsRoot() {
    40  			ret["module"] = addr.Module.String()
    41  		}
    42  	case addrs.ConfigOutputValue:
    43  		if kind := addr.CheckableKind(); kind != addrs.CheckableOutputValue {
    44  			// Something has gone very wrong
    45  			panic(fmt.Sprintf("%T has CheckableKind %s", addr, kind))
    46  		}
    47  
    48  		ret["kind"] = "output_value"
    49  		ret["name"] = addr.OutputValue.Name
    50  		if !addr.Module.IsRoot() {
    51  			ret["module"] = addr.Module.String()
    52  		}
    53  	case addrs.ConfigCheck:
    54  		if kind := addr.CheckableKind(); kind != addrs.CheckableCheck {
    55  			// Something has gone very wrong
    56  			panic(fmt.Sprintf("%T has CheckableKind %s", addr, kind))
    57  		}
    58  
    59  		ret["kind"] = "check"
    60  		ret["name"] = addr.Check.Name
    61  		if !addr.Module.IsRoot() {
    62  			ret["module"] = addr.Module.String()
    63  		}
    64  	case addrs.ConfigInputVariable:
    65  		if kind := addr.CheckableKind(); kind != addrs.CheckableInputVariable {
    66  			// Something has gone very wrong
    67  			panic(fmt.Sprintf("%T has CheckableKind %s", addr, kind))
    68  		}
    69  
    70  		ret["kind"] = "var"
    71  		ret["name"] = addr.Variable.Name
    72  		if !addr.Module.IsRoot() {
    73  			ret["module"] = addr.Module.String()
    74  		}
    75  	default:
    76  		panic(fmt.Sprintf("unsupported ConfigCheckable implementation %T", addr))
    77  	}
    78  
    79  	return ret
    80  }
    81  
    82  type dynamicObjectAddr map[string]interface{}
    83  
    84  func makeDynamicObjectAddr(addr addrs.Checkable) dynamicObjectAddr {
    85  	ret := map[string]interface{}{
    86  		"to_display": addr.String(),
    87  	}
    88  
    89  	switch addr := addr.(type) {
    90  	case addrs.AbsResourceInstance:
    91  		if !addr.Module.IsRoot() {
    92  			ret["module"] = addr.Module.String()
    93  		}
    94  		if addr.Resource.Key != addrs.NoKey {
    95  			ret["instance_key"] = addr.Resource.Key
    96  		}
    97  	case addrs.AbsOutputValue:
    98  		if !addr.Module.IsRoot() {
    99  			ret["module"] = addr.Module.String()
   100  		}
   101  	case addrs.AbsCheck:
   102  		if !addr.Module.IsRoot() {
   103  			ret["module"] = addr.Module.String()
   104  		}
   105  	case addrs.AbsInputVariableInstance:
   106  		if !addr.Module.IsRoot() {
   107  			ret["module"] = addr.Module.String()
   108  		}
   109  	default:
   110  		panic(fmt.Sprintf("unsupported Checkable implementation %T", addr))
   111  	}
   112  
   113  	return ret
   114  }