diff --git a/examples/csharp/documentation/IteratorStack.cs b/examples/csharp/documentation/IteratorStack.cs index d599d266af..2f872ece64 100644 --- a/examples/csharp/documentation/IteratorStack.cs +++ b/examples/csharp/documentation/IteratorStack.cs @@ -161,6 +161,34 @@ public IteratorStack(Construct scope, string name) : base(scope, name) Source = helpFile.Path }); // DOCS_BLOCK_END:iterators-chain + + // DOCS_BLOCK_START:iterators-for-expression + TerraformLocal values = new TerraformLocal(this, "values", new Dictionary { + { + "website ", + new Dictionary { + { "name", "website-static-files" }, + { "tags", new Dictionary { + { "app", "website" } + }} + } + }, + { + "images", + new Dictionary { + { "name", "images" }, + { "tags", new Dictionary { + { "app", "image-converter" } + }} + } + } + }); + MapTerraformIterator mapIterator = MapTerraformIterator.FromMap(values.AsAnyMap); + new TerraformLocal(this, "list-of-keys", mapIterator.MapToKey()); + new TerraformLocal(this, "list-of-names", mapIterator.MapToValueProperty("name")); + new TerraformLocal(this, "list-of-names-of-included", mapIterator.ForExpressionForList("val.name if val.included")); + new TerraformLocal(this, "map-with-names-as-key-and-tags-as-value-of-included", mapIterator.ForExpressionForMap("val.name", "val.tags if val.included")); + // DOCS_BLOCK_END:iterators-for-expression } } } diff --git a/examples/go/documentation/iterators.go b/examples/go/documentation/iterators.go index ba01c95c87..2c2c5e31fa 100644 --- a/examples/go/documentation/iterators.go +++ b/examples/go/documentation/iterators.go @@ -130,5 +130,24 @@ func NewIteratorsStack(scope constructs.Construct, name string) cdktf.TerraformS }) // DOCS_BLOCK_END:iterators-chain + // DOCS_BLOCK_START:iterators-for-expression + values := cdktf.NewTerraformLocal(stack, jsii.String("values"), []map[string]interface{}{ + { + "name": "website-static-files", + "tags": map[string]string{"app": "website"}, + }, + { + "name": "images", + "tags": map[string]string{"app": "image-converter"}, + }, + }) + + mapIterator := cdktf.TerraformIterator_FromList(values.Expression()) + cdktf.NewTerraformLocal(stack, jsii.String("list-of-keys"), mapIterator.MapToKey()) + cdktf.NewTerraformLocal(stack, jsii.String("list-of-names"), mapIterator.MapToValueProperty(jsii.String("name"))) + cdktf.NewTerraformLocal(stack, jsii.String("list-of-names-of-included"), mapIterator.ForExpressionForList(jsii.String("val.name if val.included"))) + cdktf.NewTerraformLocal(stack, jsii.String("map-with-names-as-key-and-tags-as-value-of-included"), mapIterator.ForExpressionForMap(jsii.String("val.name"), jsii.String("val.tags if val.included"))) + // DOCS_BLOCK_END:iterators-for-expression + return stack } diff --git a/examples/java/documentation/src/main/java/com/mycompany/app/MainIterator2.java b/examples/java/documentation/src/main/java/com/mycompany/app/MainIterator2.java index d5c5328b53..eaa2c825a4 100644 --- a/examples/java/documentation/src/main/java/com/mycompany/app/MainIterator2.java +++ b/examples/java/documentation/src/main/java/com/mycompany/app/MainIterator2.java @@ -88,6 +88,39 @@ public MainIterator2(Construct scope, String id) { .source(asset.getPath()) .build() ); - // DOCS_BLOCK_END:iterators-chain + // DOCS_BLOCK_END:iterators-chain + + // DOCS_BLOCK_START:iterators-for-expression + TerraformLocal values = new TerraformLocal(this, "values", new HashMap() { + { + put("website", new HashMap() { + { + put("name", "website-static-files"); + put("tags", new HashMap() { + { + put("app", "website"); + } + }); + } + }); + put("images", new HashMap() { + { + put("name", "images"); + put("tags", new HashMap() { + { + put("app", "image-converter"); + } + }); + } + }); + } + }); + + TerraformIterator mapIterator = TerraformIterator.fromMap(values.getAsAnyMap()); + new TerraformLocal(this, "list-of-keys", mapIterator.mapToKey()); + new TerraformLocal(this, "list-of-names", mapIterator.mapToValueProperty("name")); + new TerraformLocal(this, "list-of-names-of-included", mapIterator.forExpressionForList("val.name if val.included")); + new TerraformLocal(this, "map-with-names-as-key-and-tags-as-value-of-included", mapIterator.forExpressionForMap("val.name", "val.tags if val.included")); + // DOCS_BLOCK_END:iterators-for-expression } } diff --git a/examples/python/documentation/iterators.py b/examples/python/documentation/iterators.py index 3c78e3ce45..3093a6b89c 100644 --- a/examples/python/documentation/iterators.py +++ b/examples/python/documentation/iterators.py @@ -140,3 +140,24 @@ def __init__(self, scope: Construct, id: str): source=help_file.path ) # DOCS_BLOCK_END:iterators-chain + + + # DOCS_BLOCK_START:iterators-for-expression + values = TerraformLocal(self, "map-local", { + "website": { + "name": "website-static-files", + "tags": {"app": "website"} + }, + "images": { + "name": "images", + "tags": {"app": "image-converter"} + } + }) + mapIterator = TerraformIterator.from_map( + map=values.as_any_map + ) + TerraformLocal(self, "list-of-keys", mapIterator.map_to_key()) + TerraformLocal(self, "list-of-names", mapIterator.map_to_value_property("name")) + TerraformLocal(self, "list-of-names-of-included", mapIterator.for_expression_for_list("val.name if val.included")) + TerraformLocal(self, "map-with-names-as-key-and-tags-as-value-of-included", mapIterator.for_expression_for_map("val.name", "val.tags if val.included")) + # DOCS_BLOCK_END:iterators-for-expression diff --git a/examples/typescript/documentation/iterators.ts b/examples/typescript/documentation/iterators.ts index cd55a1ba9a..da20f7e694 100644 --- a/examples/typescript/documentation/iterators.ts +++ b/examples/typescript/documentation/iterators.ts @@ -5,7 +5,13 @@ import { Team } from "@cdktf/provider-github/lib/team"; import { DataGithubOrganization } from "@cdktf/provider-github/lib/data-github-organization"; import { TeamMembers } from "@cdktf/provider-github/lib/team-members"; // DOCS_BLOCK_START:iterators,iterators-complex-types -import { TerraformIterator, TerraformStack, TerraformVariable } from "cdktf"; +import { + TerraformIterator, + TerraformLocal, + TerraformOutput, + TerraformStack, + TerraformVariable, +} from "cdktf"; import { Construct } from "constructs"; import { AwsProvider } from "@cdktf/provider-aws/lib/aws-provider"; import { S3Bucket } from "@cdktf/provider-aws/lib/s3-bucket"; @@ -113,7 +119,37 @@ export class IteratorsStack extends TerraformStack { }); // DOCS_BLOCK_END:iterators-chain - // DOCS_BLOCK_START:iterators,iterators-complex-types,iterators-chain + // DOCS_BLOCK_START:iterators-for-expression + const mapIterator = TerraformIterator.fromMap({ + website: { + name: "website-static-files", + tags: { app: "website" }, + included: true, + }, + images: { + name: "images", + tags: { app: "image-converter" }, + }, + }); + new TerraformLocal(this, "list-of-keys", mapIterator.mapToKey()); + new TerraformLocal( + this, + "list-of-names", + mapIterator.mapToValueProperty("name") + ); + new TerraformLocal( + this, + "list-of-names-of-included", + mapIterator.forExpressionForList("val.name if val.included") + ); + new TerraformLocal( + this, + "map-with-names-as-key-and-tags-as-value-of-included", + mapIterator.forExpressionForMap("val.name", "val.tags if val.included") + ); + // DOCS_BLOCK_END:iterators-for-expression + + // DOCS_BLOCK_START:iterators,iterators-complex-types } } -// DOCS_BLOCK_END:iterators,iterators-complex-types,iterators-chain +// DOCS_BLOCK_END:iterators,iterators-complex-types diff --git a/website/docs/cdktf/concepts/iterators.mdx b/website/docs/cdktf/concepts/iterators.mdx index 66f8597100..44c1316e51 100644 --- a/website/docs/cdktf/concepts/iterators.mdx +++ b/website/docs/cdktf/concepts/iterators.mdx @@ -29,7 +29,13 @@ The following example uses an iterator to create a unique name for each new S3 b ```ts -import { TerraformIterator, TerraformStack, TerraformVariable } from "cdktf"; +import { + TerraformIterator, + TerraformLocal, + TerraformOutput, + TerraformStack, + TerraformVariable, +} from "cdktf"; import { Construct } from "constructs"; import { AwsProvider } from "@cdktf/provider-aws/lib/aws-provider"; import { S3Bucket } from "@cdktf/provider-aws/lib/s3-bucket"; @@ -129,7 +135,13 @@ The iterator also exposes methods to access nested attributes. The following exa ```ts -import { TerraformIterator, TerraformStack, TerraformVariable } from "cdktf"; +import { + TerraformIterator, + TerraformLocal, + TerraformOutput, + TerraformStack, + TerraformVariable, +} from "cdktf"; import { Construct } from "constructs"; import { AwsProvider } from "@cdktf/provider-aws/lib/aws-provider"; import { S3Bucket } from "@cdktf/provider-aws/lib/s3-bucket"; @@ -448,36 +460,34 @@ To chain iterators you can use the `TerraformIterator.fromResources` or `Terrafo ```ts - const s3BucketConfigurationIterator = TerraformIterator.fromMap({ - website: { - name: "website-static-files", - tags: { app: "website" }, - }, - images: { - name: "images", - tags: { app: "image-converter" }, - }, - }); +const s3BucketConfigurationIterator = TerraformIterator.fromMap({ + website: { + name: "website-static-files", + tags: { app: "website" }, + }, + images: { + name: "images", + tags: { app: "image-converter" }, + }, +}); - const s3Buckets = new S3Bucket(this, "complex-iterator-buckets", { - forEach: s3BucketConfigurationIterator, - bucket: s3BucketConfigurationIterator.getString("name"), - tags: s3BucketConfigurationIterator.getStringMap("tags"), - }); +const s3Buckets = new S3Bucket(this, "complex-iterator-buckets", { + forEach: s3BucketConfigurationIterator, + bucket: s3BucketConfigurationIterator.getString("name"), + tags: s3BucketConfigurationIterator.getStringMap("tags"), +}); - // This would be TerraformIterator.fromDataSources for data_sources - const s3BucketsIterator = TerraformIterator.fromResources(s3Buckets); - const helpFile = new TerraformAsset(this, "help", { - path: "./help", - }); - new S3BucketObject(this, "object", { - forEach: s3BucketsIterator, - bucket: s3BucketsIterator.getString("id"), - key: "help", - source: helpFile.path, - }); - } -} +// This would be TerraformIterator.fromDataSources for data_sources +const s3BucketsIterator = TerraformIterator.fromResources(s3Buckets); +const helpFile = new TerraformAsset(this, "help", { + path: "./help", +}); +new S3BucketObject(this, "object", { + forEach: s3BucketsIterator, + bucket: s3BucketsIterator.getString("id"), + key: "help", + source: helpFile.path, +}); ``` ```python @@ -650,6 +660,146 @@ To use the values of an iterator for example in a list attribute for a resource - `iterator.forExpressionForList('uppercase(val.owner) if val.owner != ""')`: Results in equivalent of `[ for key, val in toset(var.list): uppercase(val.owner) if val.owner != "" ]`. - `iterator.forExpressionForMap("val.teamName", `join(",", val.teamMembers) if length(val.teamMembers) > 0`)`: Results in equivalent of `{ for key, val in toset(var.list): val.teamName => join(",", val.teamMembers) if length(val.teamMembers) > 0 }`. + + + + + + + + +```ts +const mapIterator = TerraformIterator.fromMap({ + website: { + name: "website-static-files", + tags: { app: "website" }, + included: true, + }, + images: { + name: "images", + tags: { app: "image-converter" }, + }, +}); +new TerraformLocal(this, "list-of-keys", mapIterator.mapToKey()); +new TerraformLocal( + this, + "list-of-names", + mapIterator.mapToValueProperty("name") +); +new TerraformLocal( + this, + "list-of-names-of-included", + mapIterator.forExpressionForList("val.name if val.included") +); +new TerraformLocal( + this, + "map-with-names-as-key-and-tags-as-value-of-included", + mapIterator.forExpressionForMap("val.name", "val.tags if val.included") +); +``` + +```python +values = TerraformLocal(self, "map-local", { + "website": { + "name": "website-static-files", + "tags": {"app": "website"} + }, + "images": { + "name": "images", + "tags": {"app": "image-converter"} + } +}) +mapIterator = TerraformIterator.from_map( + map=values.as_any_map +) +TerraformLocal(self, "list-of-keys", mapIterator.map_to_key()) +TerraformLocal(self, "list-of-names", mapIterator.map_to_value_property("name")) +TerraformLocal(self, "list-of-names-of-included", mapIterator.for_expression_for_list("val.name if val.included")) +TerraformLocal(self, "map-with-names-as-key-and-tags-as-value-of-included", mapIterator.for_expression_for_map("val.name", "val.tags if val.included")) +``` + +```java + TerraformLocal values = new TerraformLocal(this, "values", new HashMap() { + { + put("website", new HashMap() { + { + put("name", "website-static-files"); + put("tags", new HashMap() { + { + put("app", "website"); + } + }); + } + }); + put("images", new HashMap() { + { + put("name", "images"); + put("tags", new HashMap() { + { + put("app", "image-converter"); + } + }); + } + }); + } + }); + + TerraformIterator mapIterator = TerraformIterator.fromMap(values.getAsAnyMap()); + new TerraformLocal(this, "list-of-keys", mapIterator.mapToKey()); + new TerraformLocal(this, "list-of-names", mapIterator.mapToValueProperty("name")); + new TerraformLocal(this, "list-of-names-of-included", mapIterator.forExpressionForList("val.name if val.included")); + new TerraformLocal(this, "map-with-names-as-key-and-tags-as-value-of-included", mapIterator.forExpressionForMap("val.name", "val.tags if val.included")); +``` + +```csharp +TerraformLocal values = new TerraformLocal(this, "values", new Dictionary { + { + "website ", + new Dictionary { + { "name", "website-static-files" }, + { "tags", new Dictionary { + { "app", "website" } + }} + } + }, + { + "images", + new Dictionary { + { "name", "images" }, + { "tags", new Dictionary { + { "app", "image-converter" } + }} + } + } +}); +MapTerraformIterator mapIterator = MapTerraformIterator.FromMap(values.AsAnyMap); +new TerraformLocal(this, "list-of-keys", mapIterator.MapToKey()); +new TerraformLocal(this, "list-of-names", mapIterator.MapToValueProperty("name")); +new TerraformLocal(this, "list-of-names-of-included", mapIterator.ForExpressionForList("val.name if val.included")); +new TerraformLocal(this, "map-with-names-as-key-and-tags-as-value-of-included", mapIterator.ForExpressionForMap("val.name", "val.tags if val.included")); +``` + +```go +values := cdktf.NewTerraformLocal(stack, jsii.String("values"), []map[string]interface{}{ + { + "name": "website-static-files", + "tags": map[string]string{"app": "website"}, + }, + { + "name": "images", + "tags": map[string]string{"app": "image-converter"}, + }, +}) + +mapIterator := cdktf.TerraformIterator_FromList(values.Expression()) +cdktf.NewTerraformLocal(stack, jsii.String("list-of-keys"), mapIterator.MapToKey()) +cdktf.NewTerraformLocal(stack, jsii.String("list-of-names"), mapIterator.MapToValueProperty(jsii.String("name"))) +cdktf.NewTerraformLocal(stack, jsii.String("list-of-names-of-included"), mapIterator.ForExpressionForList(jsii.String("val.name if val.included"))) +cdktf.NewTerraformLocal(stack, jsii.String("map-with-names-as-key-and-tags-as-value-of-included"), mapIterator.ForExpressionForMap(jsii.String("val.name"), jsii.String("val.tags if val.included"))) +``` + + + ## Using Count You can also use the `TerraformCount` class to achieve the equivalent of setting `count` on resources in HCL Terraform. Refer to the [Terraform docs](/terraform/language/meta-arguments/count) for more information on the count meta argument.