github.com/beauknowssoftware/makehcl@v0.0.0-20200322000747-1b9bb1e1c008/internal/functions/functions.go (about)

     1  package functions
     2  
     3  import (
     4  	"github.com/hashicorp/hcl/v2/ext/tryfunc"
     5  	"github.com/hashicorp/terraform/lang/funcs"
     6  	ctyyaml "github.com/zclconf/go-cty-yaml"
     7  	"github.com/zclconf/go-cty/cty"
     8  	"github.com/zclconf/go-cty/cty/function"
     9  	"github.com/zclconf/go-cty/cty/function/stdlib"
    10  )
    11  
    12  func mergeFunctions(ms ...map[string]function.Function) map[string]function.Function {
    13  	r := make(map[string]function.Function)
    14  
    15  	for _, m := range ms {
    16  		for k, v := range m {
    17  			r[k] = v
    18  		}
    19  	}
    20  
    21  	return r
    22  }
    23  
    24  var customFunctions = map[string]function.Function{
    25  	"exists":   function.New(&ExistsSpec),
    26  	"filename": function.New(&FilenameSpec),
    27  	"glob":     function.New(&GlobSpec),
    28  	"path":     function.New(&PathSpec),
    29  	"concat":   function.New(&ConcatSpec),
    30  	"shell":    function.New(&ShellSpec),
    31  }
    32  
    33  func getTerraformFunctions(wd string) map[string]function.Function {
    34  	return map[string]function.Function{
    35  		"abs":              stdlib.AbsoluteFunc,
    36  		"abspath":          funcs.AbsPathFunc,
    37  		"basename":         funcs.BasenameFunc,
    38  		"base64decode":     funcs.Base64DecodeFunc,
    39  		"base64encode":     funcs.Base64EncodeFunc,
    40  		"base64gzip":       funcs.Base64GzipFunc,
    41  		"base64sha256":     funcs.Base64Sha256Func,
    42  		"base64sha512":     funcs.Base64Sha512Func,
    43  		"bcrypt":           funcs.BcryptFunc,
    44  		"can":              tryfunc.CanFunc,
    45  		"ceil":             stdlib.CeilFunc,
    46  		"chomp":            stdlib.ChompFunc,
    47  		"cidrhost":         funcs.CidrHostFunc,
    48  		"cidrnetmask":      funcs.CidrNetmaskFunc,
    49  		"cidrsubnet":       funcs.CidrSubnetFunc,
    50  		"cidrsubnets":      funcs.CidrSubnetsFunc,
    51  		"coalesce":         funcs.CoalesceFunc,
    52  		"coalescelist":     stdlib.CoalesceListFunc,
    53  		"compact":          stdlib.CompactFunc,
    54  		"contains":         stdlib.ContainsFunc,
    55  		"csvdecode":        stdlib.CSVDecodeFunc,
    56  		"dirname":          funcs.DirnameFunc,
    57  		"distinct":         stdlib.DistinctFunc,
    58  		"element":          stdlib.ElementFunc,
    59  		"chunklist":        stdlib.ChunklistFunc,
    60  		"file":             funcs.MakeFileFunc(wd, false),
    61  		"fileexists":       funcs.MakeFileExistsFunc(wd),
    62  		"fileset":          funcs.MakeFileSetFunc(wd),
    63  		"filebase64":       funcs.MakeFileFunc(wd, true),
    64  		"filebase64sha256": funcs.MakeFileBase64Sha256Func(wd),
    65  		"filebase64sha512": funcs.MakeFileBase64Sha512Func(wd),
    66  		"filemd5":          funcs.MakeFileMd5Func(wd),
    67  		"filesha1":         funcs.MakeFileSha1Func(wd),
    68  		"filesha256":       funcs.MakeFileSha256Func(wd),
    69  		"filesha512":       funcs.MakeFileSha512Func(wd),
    70  		"flatten":          stdlib.FlattenFunc,
    71  		"floor":            stdlib.FloorFunc,
    72  		"format":           stdlib.FormatFunc,
    73  		"formatdate":       stdlib.FormatDateFunc,
    74  		"formatlist":       stdlib.FormatListFunc,
    75  		"indent":           stdlib.IndentFunc,
    76  		"index":            funcs.IndexFunc, // stdlib.IndexFunc is not compatible
    77  		"join":             stdlib.JoinFunc,
    78  		"jsondecode":       stdlib.JSONDecodeFunc,
    79  		"jsonencode":       stdlib.JSONEncodeFunc,
    80  		"keys":             stdlib.KeysFunc,
    81  		"length":           funcs.LengthFunc,
    82  		"list":             funcs.ListFunc,
    83  		"log":              stdlib.LogFunc,
    84  		"lookup":           funcs.LookupFunc,
    85  		"lower":            stdlib.LowerFunc,
    86  		"map":              funcs.MapFunc,
    87  		"matchkeys":        funcs.MatchkeysFunc,
    88  		"max":              stdlib.MaxFunc,
    89  		"md5":              funcs.Md5Func,
    90  		"merge":            stdlib.MergeFunc,
    91  		"min":              stdlib.MinFunc,
    92  		"parseint":         stdlib.ParseIntFunc,
    93  		"pathexpand":       funcs.PathExpandFunc,
    94  		"pow":              stdlib.PowFunc,
    95  		"range":            stdlib.RangeFunc,
    96  		"regex":            stdlib.RegexFunc,
    97  		"regexall":         stdlib.RegexAllFunc,
    98  		"replace":          funcs.ReplaceFunc,
    99  		"reverse":          stdlib.ReverseListFunc,
   100  		"rsadecrypt":       funcs.RsaDecryptFunc,
   101  		"setintersection":  stdlib.SetIntersectionFunc,
   102  		"setproduct":       stdlib.SetProductFunc,
   103  		"setsubtract":      stdlib.SetSubtractFunc,
   104  		"setunion":         stdlib.SetUnionFunc,
   105  		"sha1":             funcs.Sha1Func,
   106  		"sha256":           funcs.Sha256Func,
   107  		"sha512":           funcs.Sha512Func,
   108  		"signum":           stdlib.SignumFunc,
   109  		"slice":            stdlib.SliceFunc,
   110  		"sort":             stdlib.SortFunc,
   111  		"split":            stdlib.SplitFunc,
   112  		"strrev":           stdlib.ReverseFunc,
   113  		"substr":           stdlib.SubstrFunc,
   114  		"timestamp":        funcs.TimestampFunc,
   115  		"timeadd":          stdlib.TimeAddFunc,
   116  		"title":            stdlib.TitleFunc,
   117  		"tostring":         funcs.MakeToFunc(cty.String),
   118  		"tonumber":         funcs.MakeToFunc(cty.Number),
   119  		"tobool":           funcs.MakeToFunc(cty.Bool),
   120  		"toset":            funcs.MakeToFunc(cty.Set(cty.DynamicPseudoType)),
   121  		"tolist":           funcs.MakeToFunc(cty.List(cty.DynamicPseudoType)),
   122  		"tomap":            funcs.MakeToFunc(cty.Map(cty.DynamicPseudoType)),
   123  		"transpose":        funcs.TransposeFunc,
   124  		"trim":             stdlib.TrimFunc,
   125  		"trimprefix":       stdlib.TrimPrefixFunc,
   126  		"trimspace":        stdlib.TrimSpaceFunc,
   127  		"trimsuffix":       stdlib.TrimSuffixFunc,
   128  		"try":              tryfunc.TryFunc,
   129  		"upper":            stdlib.UpperFunc,
   130  		"urlencode":        funcs.URLEncodeFunc,
   131  		"uuid":             funcs.UUIDFunc,
   132  		"uuidv5":           funcs.UUIDV5Func,
   133  		"values":           stdlib.ValuesFunc,
   134  		"yamldecode":       ctyyaml.YAMLDecodeFunc,
   135  		"yamlencode":       ctyyaml.YAMLEncodeFunc,
   136  		"zipmap":           stdlib.ZipmapFunc,
   137  	}
   138  }
   139  
   140  func GetFunctions(wd string) map[string]function.Function {
   141  	return mergeFunctions(
   142  		customFunctions,
   143  		getTerraformFunctions(wd),
   144  	)
   145  }