From da51e72cbbc338aff321a9f1a06bbd5e4cf4b4a6 Mon Sep 17 00:00:00 2001 From: Martin Atkins Date: Tue, 15 Jan 2019 11:51:21 -0800 Subject: [PATCH] lang/functions: set functions from cty The sethaselement, setintersection, and setunion functions are defined in the cty stdlib. Making them available in Terraform will make it easier to work with sets, and complement the currently-Terraform-specific setproduct function. In the long run setproduct should probably move into the cty stdlib too, but since it was submitted as a Terraform function originally we'll leave it here now for simplicity's sake and reorganize later. --- lang/functions.go | 145 +++++++++--------- .../functions/sethaselement.html.md | 33 ++++ .../functions/setintersection.html.md | 40 +++++ .../functions/setproduct.html.md | 9 ++ .../configuration/functions/setunion.html.md | 43 ++++++ website/layouts/functions.erb | 12 ++ 6 files changed, 211 insertions(+), 71 deletions(-) create mode 100644 website/docs/configuration/functions/sethaselement.html.md create mode 100644 website/docs/configuration/functions/setintersection.html.md create mode 100644 website/docs/configuration/functions/setunion.html.md diff --git a/lang/functions.go b/lang/functions.go index 6b03a1271..d133d3906 100644 --- a/lang/functions.go +++ b/lang/functions.go @@ -29,77 +29,80 @@ func (s *Scope) Functions() map[string]function.Function { // that would be useful to all applications using cty functions. s.funcs = map[string]function.Function{ - "abs": stdlib.AbsoluteFunc, - "basename": funcs.BasenameFunc, - "base64decode": funcs.Base64DecodeFunc, - "base64encode": funcs.Base64EncodeFunc, - "base64gzip": funcs.Base64GzipFunc, - "base64sha256": funcs.Base64Sha256Func, - "base64sha512": funcs.Base64Sha512Func, - "bcrypt": funcs.BcryptFunc, - "ceil": funcs.CeilFunc, - "chomp": funcs.ChompFunc, - "cidrhost": funcs.CidrHostFunc, - "cidrnetmask": funcs.CidrNetmaskFunc, - "cidrsubnet": funcs.CidrSubnetFunc, - "coalesce": stdlib.CoalesceFunc, - "coalescelist": funcs.CoalesceListFunc, - "compact": funcs.CompactFunc, - "concat": stdlib.ConcatFunc, - "contains": funcs.ContainsFunc, - "csvdecode": stdlib.CSVDecodeFunc, - "dirname": funcs.DirnameFunc, - "distinct": funcs.DistinctFunc, - "element": funcs.ElementFunc, - "chunklist": funcs.ChunklistFunc, - "file": funcs.MakeFileFunc(s.BaseDir, false), - "fileexists": funcs.MakeFileExistsFunc(s.BaseDir), - "filebase64": funcs.MakeFileFunc(s.BaseDir, true), - "flatten": funcs.FlattenFunc, - "floor": funcs.FloorFunc, - "format": stdlib.FormatFunc, - "formatdate": stdlib.FormatDateFunc, - "formatlist": stdlib.FormatListFunc, - "indent": funcs.IndentFunc, - "index": funcs.IndexFunc, - "join": funcs.JoinFunc, - "jsondecode": stdlib.JSONDecodeFunc, - "jsonencode": stdlib.JSONEncodeFunc, - "keys": funcs.KeysFunc, - "length": funcs.LengthFunc, - "list": funcs.ListFunc, - "log": funcs.LogFunc, - "lookup": funcs.LookupFunc, - "lower": stdlib.LowerFunc, - "map": funcs.MapFunc, - "matchkeys": funcs.MatchkeysFunc, - "max": stdlib.MaxFunc, - "md5": funcs.Md5Func, - "merge": funcs.MergeFunc, - "min": stdlib.MinFunc, - "pathexpand": funcs.PathExpandFunc, - "pow": funcs.PowFunc, - "replace": funcs.ReplaceFunc, - "rsadecrypt": funcs.RsaDecryptFunc, - "setproduct": funcs.SetProductFunc, - "sha1": funcs.Sha1Func, - "sha256": funcs.Sha256Func, - "sha512": funcs.Sha512Func, - "signum": funcs.SignumFunc, - "slice": funcs.SliceFunc, - "sort": funcs.SortFunc, - "split": funcs.SplitFunc, - "substr": stdlib.SubstrFunc, - "timestamp": funcs.TimestampFunc, - "timeadd": funcs.TimeAddFunc, - "title": funcs.TitleFunc, - "transpose": funcs.TransposeFunc, - "trimspace": funcs.TrimSpaceFunc, - "upper": stdlib.UpperFunc, - "urlencode": funcs.URLEncodeFunc, - "uuid": funcs.UUIDFunc, - "values": funcs.ValuesFunc, - "zipmap": funcs.ZipmapFunc, + "abs": stdlib.AbsoluteFunc, + "basename": funcs.BasenameFunc, + "base64decode": funcs.Base64DecodeFunc, + "base64encode": funcs.Base64EncodeFunc, + "base64gzip": funcs.Base64GzipFunc, + "base64sha256": funcs.Base64Sha256Func, + "base64sha512": funcs.Base64Sha512Func, + "bcrypt": funcs.BcryptFunc, + "ceil": funcs.CeilFunc, + "chomp": funcs.ChompFunc, + "cidrhost": funcs.CidrHostFunc, + "cidrnetmask": funcs.CidrNetmaskFunc, + "cidrsubnet": funcs.CidrSubnetFunc, + "coalesce": stdlib.CoalesceFunc, + "coalescelist": funcs.CoalesceListFunc, + "compact": funcs.CompactFunc, + "concat": stdlib.ConcatFunc, + "contains": funcs.ContainsFunc, + "csvdecode": stdlib.CSVDecodeFunc, + "dirname": funcs.DirnameFunc, + "distinct": funcs.DistinctFunc, + "element": funcs.ElementFunc, + "chunklist": funcs.ChunklistFunc, + "file": funcs.MakeFileFunc(s.BaseDir, false), + "fileexists": funcs.MakeFileExistsFunc(s.BaseDir), + "filebase64": funcs.MakeFileFunc(s.BaseDir, true), + "flatten": funcs.FlattenFunc, + "floor": funcs.FloorFunc, + "format": stdlib.FormatFunc, + "formatdate": stdlib.FormatDateFunc, + "formatlist": stdlib.FormatListFunc, + "indent": funcs.IndentFunc, + "index": funcs.IndexFunc, + "join": funcs.JoinFunc, + "jsondecode": stdlib.JSONDecodeFunc, + "jsonencode": stdlib.JSONEncodeFunc, + "keys": funcs.KeysFunc, + "length": funcs.LengthFunc, + "list": funcs.ListFunc, + "log": funcs.LogFunc, + "lookup": funcs.LookupFunc, + "lower": stdlib.LowerFunc, + "map": funcs.MapFunc, + "matchkeys": funcs.MatchkeysFunc, + "max": stdlib.MaxFunc, + "md5": funcs.Md5Func, + "merge": funcs.MergeFunc, + "min": stdlib.MinFunc, + "pathexpand": funcs.PathExpandFunc, + "pow": funcs.PowFunc, + "replace": funcs.ReplaceFunc, + "rsadecrypt": funcs.RsaDecryptFunc, + "sethaselement": stdlib.SetHasElementFunc, + "setintersection": stdlib.SetIntersectionFunc, + "setproduct": funcs.SetProductFunc, + "setunion": stdlib.SetUnionFunc, + "sha1": funcs.Sha1Func, + "sha256": funcs.Sha256Func, + "sha512": funcs.Sha512Func, + "signum": funcs.SignumFunc, + "slice": funcs.SliceFunc, + "sort": funcs.SortFunc, + "split": funcs.SplitFunc, + "substr": stdlib.SubstrFunc, + "timestamp": funcs.TimestampFunc, + "timeadd": funcs.TimeAddFunc, + "title": funcs.TitleFunc, + "transpose": funcs.TransposeFunc, + "trimspace": funcs.TrimSpaceFunc, + "upper": stdlib.UpperFunc, + "urlencode": funcs.URLEncodeFunc, + "uuid": funcs.UUIDFunc, + "values": funcs.ValuesFunc, + "zipmap": funcs.ZipmapFunc, } s.funcs["templatefile"] = funcs.MakeTemplateFileFunc(s.BaseDir, func() map[string]function.Function { diff --git a/website/docs/configuration/functions/sethaselement.html.md b/website/docs/configuration/functions/sethaselement.html.md new file mode 100644 index 000000000..e60059a94 --- /dev/null +++ b/website/docs/configuration/functions/sethaselement.html.md @@ -0,0 +1,33 @@ +--- +layout: "functions" +page_title: "sethaselement - Functions - Configuration Language" +sidebar_current: "docs-funcs-collection-sethaselement" +description: |- + The sethaselement function tests whether a given value is in a given set. +--- + +# `sethaselement` Function + +The `sethaselement` function tests whether a given value is in a given set. + +```hcl +sethaselement(set, value) +``` + +## Examples + +``` +> sethaselement(["a", "b"], "b") +true +> sethaselement(["a", "b"], "c") +false +``` + +## Related Functions + +* [`setintersection`](./setintersection.html) computes the _intersection_ of + multiple sets. +* [`setproduct`](./setproduct.html) computes the _cartesian product_ of multiple + sets. +* [`setunion`](./setunion.html) computes the _union_ of + multiple sets. diff --git a/website/docs/configuration/functions/setintersection.html.md b/website/docs/configuration/functions/setintersection.html.md new file mode 100644 index 000000000..d3ae11eca --- /dev/null +++ b/website/docs/configuration/functions/setintersection.html.md @@ -0,0 +1,40 @@ +--- +layout: "functions" +page_title: "setintersection - Functions - Configuration Language" +sidebar_current: "docs-funcs-collection-setintersection" +description: |- + The setintersection function takes multiple sets and produces a single set + containing only the elements that all of the given sets have in common. +--- + +# `setintersection` Function + +The `setintersection` function takes multiple sets and produces a single set +containing only the elements that all of the given sets have in common. +In other words, it computes the +[intersection](https://en.wikipedia.org/wiki/Intersection_(set_theory)) of the sets. + +```hcl +setintersection(sets...) +``` + +## Examples + +``` +> setintersection(["a", "b"], ["b", "c"], ["b", "d"]) +[ + "b", +] +``` + +The given arguments are converted to sets, so the result is also a set and +the ordering of the given elements is not preserved. + +## Related Functions + +* [`sethaselement`](./sethaselement.html) tests whether a given set contains + a given element value. +* [`setproduct`](./setproduct.html) computes the _cartesian product_ of multiple + sets. +* [`setunion`](./setunion.html) computes the _union_ of + multiple sets. diff --git a/website/docs/configuration/functions/setproduct.html.md b/website/docs/configuration/functions/setproduct.html.md index 2ccb74e6d..30cdf1979 100644 --- a/website/docs/configuration/functions/setproduct.html.md +++ b/website/docs/configuration/functions/setproduct.html.md @@ -113,3 +113,12 @@ elements all have a consistent type: ], ] ``` + +## Related Functions + +* [`sethaselement`](./sethaselement.html) tests whether a given set contains + a given element value. +* [`setintersection`](./setintersection.html) computes the _intersection_ of + multiple sets. +* [`setunion`](./setunion.html) computes the _union_ of multiple + sets. diff --git a/website/docs/configuration/functions/setunion.html.md b/website/docs/configuration/functions/setunion.html.md new file mode 100644 index 000000000..1636d20a4 --- /dev/null +++ b/website/docs/configuration/functions/setunion.html.md @@ -0,0 +1,43 @@ +--- +layout: "functions" +page_title: "setunion - Functions - Configuration Language" +sidebar_current: "docs-funcs-collection-setunion" +description: |- + The setunion function takes multiple sets and produces a single set + containing the elements from all of the given sets. +--- + +# `setunion` Function + +The `setunion` function takes multiple sets and produces a single set +containing the elements from all of the given sets. In other words, it +computes the [union](https://en.wikipedia.org/wiki/Union_(set_theory)) of +the sets. + +```hcl +setunion(sets...) +``` + +## Examples + +``` +> setunion(["a", "b"], ["b", "c"], ["d"]) +[ + "d", + "b", + "c", + "a", +] +``` + +The given arguments are converted to sets, so the result is also a set and +the ordering of the given elements is not preserved. + +## Related Functions + +* [`sethaselement`](./sethaselement.html) tests whether a given set contains + a given element value. +* [`setintersection`](./setintersection.html) computes the _intersection_ of + multiple sets. +* [`setproduct`](./setproduct.html) computes the _cartesian product_ of multiple + sets. diff --git a/website/layouts/functions.erb b/website/layouts/functions.erb index 2546c67b1..9c77cf089 100644 --- a/website/layouts/functions.erb +++ b/website/layouts/functions.erb @@ -171,10 +171,22 @@ merge + > + sethaselement + + + > + setintersection + + > setproduct + > + setunion + + > slice