github.com/pulumi/pulumi-aws/sdk/v6@v6.32.0/go/aws/internal/pulumiUtilities.go (about)

     1  // Code generated by the Pulumi Terraform Bridge (tfgen) Tool DO NOT EDIT.
     2  // *** WARNING: Do not edit by hand unless you're certain you know what you are doing! ***
     3  
     4  package internal
     5  
     6  import (
     7  	"fmt"
     8  	"os"
     9  	"reflect"
    10  	"regexp"
    11  	"strconv"
    12  	"strings"
    13  
    14  	"github.com/blang/semver"
    15  	"github.com/pulumi/pulumi/sdk/v3/go/pulumi"
    16  )
    17  
    18  import (
    19  	"github.com/pulumi/pulumi/sdk/v3/go/pulumi/internals"
    20  )
    21  
    22  type envParser func(v string) interface{}
    23  
    24  func ParseEnvBool(v string) interface{} {
    25  	b, err := strconv.ParseBool(v)
    26  	if err != nil {
    27  		return nil
    28  	}
    29  	return b
    30  }
    31  
    32  func ParseEnvInt(v string) interface{} {
    33  	i, err := strconv.ParseInt(v, 0, 0)
    34  	if err != nil {
    35  		return nil
    36  	}
    37  	return int(i)
    38  }
    39  
    40  func ParseEnvFloat(v string) interface{} {
    41  	f, err := strconv.ParseFloat(v, 64)
    42  	if err != nil {
    43  		return nil
    44  	}
    45  	return f
    46  }
    47  
    48  func ParseEnvStringArray(v string) interface{} {
    49  	var result pulumi.StringArray
    50  	for _, item := range strings.Split(v, ";") {
    51  		result = append(result, pulumi.String(item))
    52  	}
    53  	return result
    54  }
    55  
    56  func GetEnvOrDefault(def interface{}, parser envParser, vars ...string) interface{} {
    57  	for _, v := range vars {
    58  		if value, ok := os.LookupEnv(v); ok {
    59  			if parser != nil {
    60  				return parser(value)
    61  			}
    62  			return value
    63  		}
    64  	}
    65  	return def
    66  }
    67  
    68  // PkgVersion uses reflection to determine the version of the current package.
    69  // If a version cannot be determined, v1 will be assumed. The second return
    70  // value is always nil.
    71  func PkgVersion() (semver.Version, error) {
    72  	// emptyVersion defaults to v0.0.0
    73  	if !SdkVersion.Equals(semver.Version{}) {
    74  		return SdkVersion, nil
    75  	}
    76  	type sentinal struct{}
    77  	pkgPath := reflect.TypeOf(sentinal{}).PkgPath()
    78  	re := regexp.MustCompile("^.*/pulumi-aws/sdk(/v\\d+)?")
    79  	if match := re.FindStringSubmatch(pkgPath); match != nil {
    80  		vStr := match[1]
    81  		if len(vStr) == 0 { // If the version capture group was empty, default to v1.
    82  			return semver.Version{Major: 1}, nil
    83  		}
    84  		return semver.MustParse(fmt.Sprintf("%s.0.0", vStr[2:])), nil
    85  	}
    86  	return semver.Version{Major: 1}, nil
    87  }
    88  
    89  // isZero is a null safe check for if a value is it's types zero value.
    90  func IsZero(v interface{}) bool {
    91  	if v == nil {
    92  		return true
    93  	}
    94  	return reflect.ValueOf(v).IsZero()
    95  }
    96  
    97  func CallPlain(
    98  	ctx *pulumi.Context,
    99  	tok string,
   100  	args pulumi.Input,
   101  	output pulumi.Output,
   102  	self pulumi.Resource,
   103  	property string,
   104  	resultPtr reflect.Value,
   105  	errorPtr *error,
   106  	opts ...pulumi.InvokeOption,
   107  ) {
   108  	res, err := callPlainInner(ctx, tok, args, output, self, opts...)
   109  	if err != nil {
   110  		*errorPtr = err
   111  		return
   112  	}
   113  
   114  	v := reflect.ValueOf(res)
   115  
   116  	// extract res.property field if asked to do so
   117  	if property != "" {
   118  		v = v.FieldByName("Res")
   119  	}
   120  
   121  	// return by setting the result pointer; this style of returns shortens the generated code without generics
   122  	resultPtr.Elem().Set(v)
   123  }
   124  
   125  func callPlainInner(
   126  	ctx *pulumi.Context,
   127  	tok string,
   128  	args pulumi.Input,
   129  	output pulumi.Output,
   130  	self pulumi.Resource,
   131  	opts ...pulumi.InvokeOption,
   132  ) (any, error) {
   133  	o, err := ctx.Call(tok, args, output, self, opts...)
   134  	if err != nil {
   135  		return nil, err
   136  	}
   137  
   138  	outputData, err := internals.UnsafeAwaitOutput(ctx.Context(), o)
   139  	if err != nil {
   140  		return nil, err
   141  	}
   142  
   143  	// Ingoring deps silently. They are typically non-empty, r.f() calls include r as a dependency.
   144  	known := outputData.Known
   145  	value := outputData.Value
   146  	secret := outputData.Secret
   147  
   148  	problem := ""
   149  	if !known {
   150  		problem = "an unknown value"
   151  	} else if secret {
   152  		problem = "a secret value"
   153  	}
   154  
   155  	if problem != "" {
   156  		return nil, fmt.Errorf("Plain resource method %q incorrectly returned %s. "+
   157  			"This is an error in the provider, please report this to the provider developer.",
   158  			tok, problem)
   159  	}
   160  
   161  	return value, nil
   162  }
   163  
   164  // PkgResourceDefaultOpts provides package level defaults to pulumi.OptionResource.
   165  func PkgResourceDefaultOpts(opts []pulumi.ResourceOption) []pulumi.ResourceOption {
   166  	defaults := []pulumi.ResourceOption{}
   167  
   168  	version := SdkVersion
   169  	if !version.Equals(semver.Version{}) {
   170  		defaults = append(defaults, pulumi.Version(version.String()))
   171  	}
   172  	return append(defaults, opts...)
   173  }
   174  
   175  // PkgInvokeDefaultOpts provides package level defaults to pulumi.OptionInvoke.
   176  func PkgInvokeDefaultOpts(opts []pulumi.InvokeOption) []pulumi.InvokeOption {
   177  	defaults := []pulumi.InvokeOption{}
   178  
   179  	version := SdkVersion
   180  	if !version.Equals(semver.Version{}) {
   181  		defaults = append(defaults, pulumi.Version(version.String()))
   182  	}
   183  	return append(defaults, opts...)
   184  }