Documentation ¶
Index ¶
Constants ¶
This section is empty.
Variables ¶
var AllTrueFunc = function.New(&function.Spec{ Params: []function.Parameter{ { Name: "list", Type: cty.List(cty.Bool), }, }, Type: function.StaticReturnType(cty.Bool), Impl: func(args []cty.Value, retType cty.Type) (ret cty.Value, err error) { result := cty.True for it := args[0].ElementIterator(); it.Next(); { _, v := it.Element() if !v.IsKnown() { return cty.UnknownVal(cty.Bool), nil } if v.IsNull() { return cty.False, nil } result = result.And(v) if result.False() { return cty.False, nil } } return result, nil }, })
AllTrueFunc constructs a function that returns true if all elements of the list are true. If the list is empty, return true.
var AnyTrueFunc = function.New(&function.Spec{ Params: []function.Parameter{ { Name: "list", Type: cty.List(cty.Bool), }, }, Type: function.StaticReturnType(cty.Bool), Impl: func(args []cty.Value, retType cty.Type) (ret cty.Value, err error) { result := cty.False var hasUnknown bool for it := args[0].ElementIterator(); it.Next(); { _, v := it.Element() if !v.IsKnown() { hasUnknown = true continue } if v.IsNull() { continue } result = result.Or(v) if result.True() { return cty.True, nil } } if hasUnknown { return cty.UnknownVal(cty.Bool), nil } return result, nil }, })
AnyTrueFunc constructs a function that returns true if any element of the list is true. If the list is empty, return false.
var Base64DecodeFunc = function.New(&function.Spec{ Params: []function.Parameter{ { Name: "str", Type: cty.String, AllowMarked: true, }, }, Type: function.StaticReturnType(cty.String), Impl: func(args []cty.Value, retType cty.Type) (cty.Value, error) { str, strMarks := args[0].Unmark() s := str.AsString() sDec, err := base64.StdEncoding.DecodeString(s) if err != nil { return cty.UnknownVal(cty.String), fmt.Errorf("failed to decode base64 data %s", s) } if !utf8.Valid(sDec) { return cty.UnknownVal(cty.String), errors.New("the result of decoding the provided string is not valid UTF-8") } return cty.StringVal(string(sDec)).WithMarks(strMarks), nil }, })
Base64DecodeFunc constructs a function that decodes a string containing a base64 sequence.
var Base64EncodeFunc = function.New(&function.Spec{ Params: []function.Parameter{ { Name: "str", Type: cty.String, }, }, Type: function.StaticReturnType(cty.String), Impl: func(args []cty.Value, retType cty.Type) (cty.Value, error) { return cty.StringVal(base64.StdEncoding.EncodeToString([]byte(args[0].AsString()))), nil }, })
Base64EncodeFunc constructs a function that encodes a string to a base64 sequence.
var Base64GzipFunc = function.New(&function.Spec{ Params: []function.Parameter{ { Name: "str", Type: cty.String, }, }, Type: function.StaticReturnType(cty.String), Impl: func(args []cty.Value, retType cty.Type) (cty.Value, error) { s := args[0].AsString() var b bytes.Buffer gz := gzip.NewWriter(&b) if _, err := gz.Write([]byte(s)); err != nil { return cty.UnknownVal(cty.String), fmt.Errorf("failed to write gzip raw data: %w", err) } if err := gz.Flush(); err != nil { return cty.UnknownVal(cty.String), fmt.Errorf("failed to flush gzip writer: %w", err) } if err := gz.Close(); err != nil { return cty.UnknownVal(cty.String), fmt.Errorf("failed to close gzip writer: %w", err) } return cty.StringVal(base64.StdEncoding.EncodeToString(b.Bytes())), nil }, })
Base64GzipFunc constructs a function that compresses a string with gzip and then encodes the result in Base64 encoding.
var EndsWithFunc = function.New(&function.Spec{ Params: []function.Parameter{ { Name: "str", Type: cty.String, }, { Name: "suffix", Type: cty.String, }, }, Type: function.StaticReturnType(cty.Bool), Impl: func(args []cty.Value, retType cty.Type) (cty.Value, error) { str := args[0].AsString() suffix := args[1].AsString() if strings.HasSuffix(str, suffix) { return cty.True, nil } return cty.False, nil }, })
EndsWithFunc constructs a function that checks if a string ends with a specific suffix using strings.HasSuffix.
var JoinPathFunc = function.New(&function.Spec{ Params: []function.Parameter{ { Name: "root", Type: cty.String, }, { Name: "path", Type: cty.String, }, }, Type: function.StaticReturnType(cty.String), Impl: func(args []cty.Value, retType cty.Type) (cty.Value, error) { return cty.StringVal(filepath.ToSlash(filepath.Join( args[0].AsString(), args[1].AsString()), )), nil }, })
JoinPathFunc constructs a function that converts joins two paths.
var MatchkeysFunc = function.New(&function.Spec{ Params: []function.Parameter{ { Name: "values", Type: cty.List(cty.DynamicPseudoType), }, { Name: "keys", Type: cty.List(cty.DynamicPseudoType), }, { Name: "searchset", Type: cty.List(cty.DynamicPseudoType), }, }, Type: func(args []cty.Value) (cty.Type, error) { ty, _ := convert.UnifyUnsafe([]cty.Type{args[1].Type(), args[2].Type()}) if ty == cty.NilType { return cty.NilType, errors.New("keys and searchset must be of the same type") } return args[0].Type(), nil }, Impl: func(args []cty.Value, retType cty.Type) (ret cty.Value, err error) { if !args[0].IsKnown() { return cty.UnknownVal(cty.List(retType.ElementType())), nil } if args[0].LengthInt() != args[1].LengthInt() { return cty.ListValEmpty(retType.ElementType()), errors.New("length of keys and values should be equal") } output := make([]cty.Value, 0) values := args[0] ty, _ := convert.UnifyUnsafe([]cty.Type{args[1].Type(), args[2].Type()}) keys, _ := convert.Convert(args[1], ty) searchset, _ := convert.Convert(args[2], ty) if searchset.LengthInt() == 0 { return cty.ListValEmpty(retType.ElementType()), nil } if !values.IsWhollyKnown() || !keys.IsWhollyKnown() { return cty.UnknownVal(retType), nil } i := 0 for it := keys.ElementIterator(); it.Next(); { _, key := it.Element() for iter := searchset.ElementIterator(); iter.Next(); { _, search := iter.Element() eq, err := stdlib.Equal(key, search) if err != nil { return cty.NilVal, err } if !eq.IsKnown() { return cty.ListValEmpty(retType.ElementType()), nil } if eq.True() { v := values.Index(cty.NumberIntVal(int64(i))) output = append(output, v) break } } i++ } if len(output) == 0 { return cty.ListValEmpty(retType.ElementType()), nil } return cty.ListVal(output), nil }, })
MatchkeysFunc constructs a function that constructs a new list by taking a subset of elements from one list whose indexes match the corresponding indexes of values in another list.
var OneFunc = function.New(&function.Spec{ Params: []function.Parameter{ { Name: "list", Type: cty.DynamicPseudoType, }, }, Type: func(args []cty.Value) (cty.Type, error) { ty := args[0].Type() switch { case ty.IsListType() || ty.IsSetType(): return ty.ElementType(), nil case ty.IsTupleType(): etys := ty.TupleElementTypes() switch len(etys) { case 0: return cty.DynamicPseudoType, nil case 1: return etys[0], nil } } return cty.NilType, function.NewArgErrorf(0, "must be a list, set, or tuple value with either zero or one elements") }, Impl: func(args []cty.Value, retType cty.Type) (ret cty.Value, err error) { val := args[0] ty := val.Type() switch { case ty.IsListType() || ty.IsSetType(): lenVal := val.Length() if !lenVal.IsKnown() { return cty.UnknownVal(retType), nil } var l int err := gocty.FromCtyValue(lenVal, &l) if err != nil { return cty.NilVal, fmt.Errorf("invalid collection length: %s", err) } switch l { case 0: return cty.NullVal(retType), nil case 1: var ret cty.Value for it := val.ElementIterator(); it.Next(); { _, ret = it.Element() } return ret, nil } case ty.IsTupleType(): etys := ty.TupleElementTypes() switch len(etys) { case 0: return cty.NullVal(retType), nil case 1: ret := val.Index(cty.NumberIntVal(0)) return ret, nil } } return cty.NilVal, function.NewArgErrorf(0, "must be a list, set, or tuple value with either zero or one elements") }, })
OneFunc returns either the first element of a one-element list, or null if given a zero-element list.
var SemverConstraint = function.New(&function.Spec{ Params: []function.Parameter{ { Name: "version", Type: cty.String, }, { Name: "constraint", Type: cty.String, }, }, Type: function.StaticReturnType(cty.Bool), Impl: func(args []cty.Value, retType cty.Type) (cty.Value, error) { version, constraint := args[0].AsString(), args[1].AsString() v, err := semver.NewVersion(version) if err != nil { return cty.NullVal(cty.Bool), err } c, err := semver.NewConstraint(constraint) if err != nil { return cty.NullVal(cty.Bool), err } return cty.BoolVal(c.Check(v)), nil }, })
SemverConstraint takes a semantic version and a constraint and returns a boolean of whether or not the constaint has been met.
var StartsWithFunc = function.New(&function.Spec{ Params: []function.Parameter{ { Name: "str", Type: cty.String, AllowUnknown: true, }, { Name: "prefix", Type: cty.String, }, }, Type: function.StaticReturnType(cty.Bool), Impl: func(args []cty.Value, retType cty.Type) (cty.Value, error) { prefix := args[1].AsString() if !args[0].IsKnown() { if prefix == "" { return cty.True, nil } if knownPrefix := args[0].Range().StringPrefix(); knownPrefix != "" { if strings.HasPrefix(knownPrefix, prefix) { return cty.True, nil } if len(knownPrefix) >= len(prefix) { return cty.False, nil } } return cty.UnknownVal(cty.Bool), nil } str := args[0].AsString() if strings.HasPrefix(str, prefix) { return cty.True, nil } return cty.False, nil }, })
StartsWithFunc constructs a function that checks if a string starts with a specific prefix using strings.HasPrefix.
var StrContainsFunc = function.New(&function.Spec{ Params: []function.Parameter{ { Name: "str", Type: cty.String, }, { Name: "substr", Type: cty.String, }, }, Type: function.StaticReturnType(cty.Bool), Impl: func(args []cty.Value, retType cty.Type) (ret cty.Value, err error) { str := args[0].AsString() substr := args[1].AsString() if strings.Contains(str, substr) { return cty.True, nil } return cty.False, nil }, })
StrContainsFunc searches a given string for another given substring, if found the function returns true, otherwise returns false.
var SumFunc = function.New(&function.Spec{ Params: []function.Parameter{ { Name: "list", Type: cty.DynamicPseudoType, }, }, Type: function.StaticReturnType(cty.Number), Impl: func(args []cty.Value, retType cty.Type) (ret cty.Value, err error) { if !args[0].CanIterateElements() { return cty.NilVal, function.NewArgErrorf(0, "cannot sum noniterable") } if args[0].LengthInt() == 0 { return cty.NilVal, function.NewArgErrorf(0, "cannot sum an empty list") } arg := args[0].AsValueSlice() ty := args[0].Type() if !ty.IsListType() && !ty.IsSetType() && !ty.IsTupleType() { return cty.NilVal, function.NewArgErrorf(0, "argument must be list, set, or tuple. Received "+ty.FriendlyName()) } if !args[0].IsWhollyKnown() { return cty.UnknownVal(cty.Number), nil } defer func() { if r := recover(); r != nil { if _, ok := r.(big.ErrNaN); ok { ret = cty.NilVal err = errors.New("can't compute sum of opposing infinities") } else { panic(r) } } }() s := arg[0] if s.IsNull() { return cty.NilVal, function.NewArgErrorf(0, "argument must be list, set, or tuple of number values") } s, err = convert.Convert(s, cty.Number) if err != nil { return cty.NilVal, function.NewArgErrorf(0, "argument must be list, set, or tuple of number values") } for _, v := range arg[1:] { if v.IsNull() { return cty.NilVal, function.NewArgErrorf(0, "argument must be list, set, or tuple of number values") } v, err = convert.Convert(v, cty.Number) if err != nil { return cty.NilVal, function.NewArgErrorf(0, "argument must be list, set, or tuple of number values") } s = s.Add(v) } return s, nil }, })
SumFunc constructs a function that returns the sum of all numbers provided in a list.
var TextDecodeBase64Func = function.New(&function.Spec{ Params: []function.Parameter{ { Name: "source", Type: cty.String, }, { Name: "encoding", Type: cty.String, }, }, Type: function.StaticReturnType(cty.String), Impl: func(args []cty.Value, retType cty.Type) (cty.Value, error) { encoding, err := ianaindex.IANA.Encoding(args[1].AsString()) if err != nil || encoding == nil { return cty.UnknownVal(cty.String), function.NewArgErrorf(1, "%q is not a supported IANA encoding name or alias in this Terraform version", args[1].AsString()) } encName, err := ianaindex.IANA.Name(encoding) if err != nil { encName = args[1].AsString() } s := args[0].AsString() sDec, err := base64.StdEncoding.DecodeString(s) if err != nil { switch err := err.(type) { case base64.CorruptInputError: return cty.UnknownVal(cty.String), function.NewArgErrorf(0, "the given value is has an invalid base64 symbol at offset %d", int(err)) default: return cty.UnknownVal(cty.String), function.NewArgErrorf(0, "invalid source string: %w", err) } } decoder := encoding.NewDecoder() decoded, err := decoder.Bytes(sDec) if err != nil || bytes.ContainsRune(decoded, '�') { return cty.UnknownVal(cty.String), function.NewArgErrorf(0, "the given string contains symbols that are not defined for %s", encName) } return cty.StringVal(string(decoded)), nil }, })
TextDecodeBase64Func constructs a function that decodes a base64 sequence to a target encoding.
var TextEncodeBase64Func = function.New(&function.Spec{ Params: []function.Parameter{ { Name: "string", Type: cty.String, }, { Name: "encoding", Type: cty.String, }, }, Type: function.StaticReturnType(cty.String), Impl: func(args []cty.Value, retType cty.Type) (cty.Value, error) { encoding, err := ianaindex.IANA.Encoding(args[1].AsString()) if err != nil || encoding == nil { return cty.UnknownVal(cty.String), function.NewArgErrorf(1, "%q is not a supported IANA encoding name or alias in this Terraform version", args[1].AsString()) } encName, err := ianaindex.IANA.Name(encoding) if err != nil { encName = args[1].AsString() } encoder := encoding.NewEncoder() encodedInput, err := encoder.Bytes([]byte(args[0].AsString())) if err != nil { return cty.UnknownVal(cty.String), function.NewArgErrorf(0, "the given string contains characters that cannot be represented in %s", encName) } return cty.StringVal(base64.StdEncoding.EncodeToString(encodedInput)), nil }, })
TextEncodeBase64Func constructs a function that encodes a string to a target encoding and then to a base64 sequence.
var TimeCmpFunc = function.New(&function.Spec{ Params: []function.Parameter{ { Name: "timestamp_a", Type: cty.String, }, { Name: "timestamp_b", Type: cty.String, }, }, Type: function.StaticReturnType(cty.Number), Impl: func(args []cty.Value, retType cty.Type) (cty.Value, error) { tsA, err := parseTimestamp(args[0].AsString()) if err != nil { return cty.UnknownVal(cty.String), function.NewArgError(0, err) } tsB, err := parseTimestamp(args[1].AsString()) if err != nil { return cty.UnknownVal(cty.String), function.NewArgError(1, err) } switch { case tsA.Equal(tsB): return cty.NumberIntVal(0), nil case tsA.Before(tsB): return cty.NumberIntVal(-1), nil default: return cty.NumberIntVal(1), nil } }, })
TimeCmpFunc is a function that compares two timestamps.
var TimestampFunc = function.New(&function.Spec{ Params: []function.Parameter{}, Type: function.StaticReturnType(cty.String), Impl: func(args []cty.Value, retType cty.Type) (cty.Value, error) { return cty.StringVal(time.Now().UTC().Format(time.RFC3339)), nil }, })
TimestampFunc constructs a function that returns a string representation of the current date and time.
var TransposeFunc = function.New(&function.Spec{ Params: []function.Parameter{ { Name: "values", Type: cty.Map(cty.List(cty.String)), }, }, Type: function.StaticReturnType(cty.Map(cty.List(cty.String))), Impl: func(args []cty.Value, retType cty.Type) (ret cty.Value, err error) { inputMap := args[0] if !inputMap.IsWhollyKnown() { return cty.UnknownVal(retType), nil } outputMap := make(map[string]cty.Value) tmpMap := make(map[string][]string) for it := inputMap.ElementIterator(); it.Next(); { inKey, inVal := it.Element() for iter := inVal.ElementIterator(); iter.Next(); { _, val := iter.Element() if !val.Type().Equals(cty.String) { return cty.MapValEmpty(cty.List(cty.String)), errors.New("input must be a map of lists of strings") } outKey := val.AsString() if _, ok := tmpMap[outKey]; !ok { tmpMap[outKey] = make([]string, 0) } outVal := tmpMap[outKey] outVal = append(outVal, inKey.AsString()) sort.Strings(outVal) tmpMap[outKey] = outVal } } for outKey, outVal := range tmpMap { values := make([]cty.Value, 0) for _, v := range outVal { values = append(values, cty.StringVal(v)) } outputMap[outKey] = cty.ListVal(values) } if len(outputMap) == 0 { return cty.MapValEmpty(cty.List(cty.String)), nil } return cty.MapVal(outputMap), nil }, })
TransposeFunc constructs a function that takes a map of lists of strings and swaps the keys and values to produce a new map of lists of strings.
var URLEncodeFunc = function.New(&function.Spec{ Params: []function.Parameter{ { Name: "str", Type: cty.String, }, }, Type: function.StaticReturnType(cty.String), Impl: func(args []cty.Value, retType cty.Type) (cty.Value, error) { return cty.StringVal(url.QueryEscape(args[0].AsString())), nil }, })
URLEncodeFunc constructs a function that applies URL encoding to a given string.
Functions ¶
func AbsPathFunc ¶
AbsPathFunc constructs a function that converts a filesystem path to an absolute path. It takes basePath that is equal to the decoders working directory, that way relative paths are relative to the working dir.
Types ¶
This section is empty.