<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>function-hcl</title><link>https://crossplane-contrib.github.io/function-hcl/</link><description>Recent content on function-hcl</description><generator>Hugo</generator><language>en</language><atom:link href="https://crossplane-contrib.github.io/function-hcl/index.xml" rel="self" type="application/rss+xml"/><item><title>Best Practices</title><link>https://crossplane-contrib.github.io/function-hcl/docs/tips-and-pitfalls/best-practices/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://crossplane-contrib.github.io/function-hcl/docs/tips-and-pitfalls/best-practices/</guid><description>&lt;h2 id="always-use-fn-hcl-tools-package"&gt;Always use fn-hcl-tools package&lt;/h2&gt;
&lt;p&gt;Run &lt;code&gt;fn-hcl-tools package&lt;/code&gt; to produce your txtar script rather than hand-crafting it. This
validates your HCL before it reaches the cluster, catching typos in variable names, bad block
structure, and syntax errors at authoring time.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;fn-hcl-tools package ./my-composition/
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="use-locals-to-name-things"&gt;Use locals to name things&lt;/h2&gt;
&lt;p&gt;Pull commonly-used expressions into top-level locals. This makes the code easier to read and
avoids long repeated expressions like &lt;code&gt;req.composite.spec.parameters&lt;/code&gt; deep inside resource bodies.&lt;/p&gt;</description></item><item><title>DSL Specification</title><link>https://crossplane-contrib.github.io/function-hcl/docs/reference/dsl-specification/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://crossplane-contrib.github.io/function-hcl/docs/reference/dsl-specification/</guid><description>&lt;div class="alert alert-info" role="alert"&gt;
&lt;h4 class="alert-heading"&gt;Source of truth&lt;/h4&gt;
&lt;p&gt;This page is derived from &lt;a href="https://github.com/crossplane-contrib/function-hcl/blob/main/spec.md"&gt;&lt;code&gt;spec.md&lt;/code&gt;&lt;/a&gt;
in the repository. If you find a discrepancy, the repository version is authoritative.&lt;/p&gt;
&lt;/div&gt;
&lt;h2 id="input-format"&gt;Input Format&lt;/h2&gt;
&lt;p&gt;The function accepts its HCL program in &lt;a href="https://pkg.go.dev/golang.org/x/tools/txtar#hdr-Txtar_format"&gt;txtar format&lt;/a&gt;
via the &lt;code&gt;input&lt;/code&gt; field of the Composition pipeline step. All files are treated as one unit.&lt;/p&gt;
&lt;h2 id="external-variables"&gt;External Variables&lt;/h2&gt;
&lt;p&gt;Created automatically from the &lt;code&gt;RunFunctionRequest&lt;/code&gt;. Accessed as &lt;code&gt;req.&amp;lt;field&amp;gt;&lt;/code&gt;.&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Variable&lt;/th&gt;
 &lt;th&gt;Type&lt;/th&gt;
 &lt;th&gt;Description&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;req.composite&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;object&lt;/td&gt;
 &lt;td&gt;Observed composite resource (XR)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;req.composite_connection&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;map(string, bytes)&lt;/td&gt;
 &lt;td&gt;Observed connection details of the composite&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;req.resource&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;map(string, object)&lt;/td&gt;
 &lt;td&gt;Observed resource bodies, keyed by crossplane name&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;req.connection&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;map(string, map(string, bytes))&lt;/td&gt;
 &lt;td&gt;Observed connection details, keyed by resource name&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;req.resources&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;map(string, list(object))&lt;/td&gt;
 &lt;td&gt;Observed resource collections, keyed by base name&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;req.connections&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;map(string, list(map(string, bytes)))&lt;/td&gt;
 &lt;td&gt;Connection details of collections&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;req.context&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;map(string, any)&lt;/td&gt;
 &lt;td&gt;Pipeline context&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;req.extra_resources&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;map(string, list(object))&lt;/td&gt;
 &lt;td&gt;Extra resources from &lt;code&gt;requirement&lt;/code&gt; blocks&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="top-level-blocks"&gt;Top-Level Blocks&lt;/h2&gt;
&lt;h3 id="locals"&gt;&lt;code&gt;locals&lt;/code&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-hcl" data-lang="hcl"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;locals&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt; &amp;lt;name&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="err"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;expression&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;Accessed by name directly (no &lt;code&gt;local.&lt;/code&gt; prefix).&lt;/li&gt;
&lt;li&gt;Ordering does not matter; locals with incomplete values are evaluated lazily.&lt;/li&gt;
&lt;li&gt;Circular references are an error.&lt;/li&gt;
&lt;li&gt;Cannot shadow names from parent scopes.&lt;/li&gt;
&lt;li&gt;Can be defined at: top level, &lt;code&gt;resource&lt;/code&gt;, &lt;code&gt;resources&lt;/code&gt; template, &lt;code&gt;group&lt;/code&gt;, &lt;code&gt;requirement&lt;/code&gt;, &lt;code&gt;function&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="resource"&gt;&lt;code&gt;resource&lt;/code&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-hcl" data-lang="hcl"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;resource&lt;/span&gt; &lt;span class="err"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;crossplane&lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="k"&gt;name&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt; condition&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="err"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;bool&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;&lt;/span&gt;&lt;span class="c1"&gt; # optional
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;locals&lt;/span&gt; { &lt;span class="p"&gt;...&lt;/span&gt; }&lt;span class="c1"&gt; # optional
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt; body&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; { &lt;span class="err"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;k8s&lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="k"&gt;manifest&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;&lt;/span&gt; }&lt;span class="c1"&gt; # required
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt; composite status { body&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; { &lt;span class="p"&gt;...&lt;/span&gt; } }&lt;span class="c1"&gt; # optional, repeatable
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt; composite connection { body&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; { &lt;span class="p"&gt;...&lt;/span&gt; } }&lt;span class="c1"&gt; # optional, repeatable
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt; ready { value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="err"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;string&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;&lt;/span&gt; }&lt;span class="c1"&gt; # optional
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Special variables&lt;/strong&gt;: &lt;code&gt;self.name&lt;/code&gt;, &lt;code&gt;self.resource&lt;/code&gt;, &lt;code&gt;self.connection&lt;/code&gt;&lt;/p&gt;</description></item><item><title>How It Works</title><link>https://crossplane-contrib.github.io/function-hcl/docs/concepts/how-it-works/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://crossplane-contrib.github.io/function-hcl/docs/concepts/how-it-works/</guid><description>&lt;h2 id="the-crossplane-function-pipeline"&gt;The Crossplane Function Pipeline&lt;/h2&gt;
&lt;p&gt;Crossplane composition functions run as steps in a pipeline. Each step receives the current desired state,
may modify it, and passes it on to the next step. function-hcl is one such step.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;Crossplane
 |
 v
+---------------------+
| function-hcl | &amp;lt;-- reads req.composite, evaluates HCL, writes desired resources
+---------------------+
 |
 v
 (next function or final reconcile)
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="what-function-hcl-does"&gt;What function-hcl Does&lt;/h2&gt;
&lt;p&gt;When Crossplane calls function-hcl, it:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Unpacks the input&lt;/strong&gt; &amp;ndash; reads the HCL scripts from the Composition pipeline step&amp;rsquo;s &lt;code&gt;input&lt;/code&gt; field.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Evaluates the HCL&lt;/strong&gt; &amp;ndash; runs the script with access to the current composite resource, observed resources, and context.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Builds desired resources&lt;/strong&gt; &amp;ndash; each &lt;code&gt;resource&lt;/code&gt; block that evaluates successfully contributes a desired composed resource to the output. Each &lt;code&gt;resources&lt;/code&gt; block produces additional resources in the desired state.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Defers incomplete blocks&lt;/strong&gt; &amp;ndash; resource blocks that contain &lt;a href="../../language-guide/hcl-basics/#incomplete-values"&gt;incomplete values&lt;/a&gt; (e.g. a status field from a resource that hasn&amp;rsquo;t been created yet) are &lt;em&gt;silently deferred&lt;/em&gt; rather than causing an error.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Writes back status / connection details / context&lt;/strong&gt; &amp;ndash; &lt;code&gt;composite status&lt;/code&gt;, &lt;code&gt;composite connection&lt;/code&gt;, and &lt;code&gt;context&lt;/code&gt; blocks write values back to the composite resource or pipeline context.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="the-reconcile-loop"&gt;The Reconcile Loop&lt;/h2&gt;
&lt;p&gt;Crossplane runs composition functions repeatedly as the state of the world changes. This is important for
understanding function-hcl&amp;rsquo;s behavior:&lt;/p&gt;</description></item><item><title>Installation</title><link>https://crossplane-contrib.github.io/function-hcl/docs/getting-started/installation/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://crossplane-contrib.github.io/function-hcl/docs/getting-started/installation/</guid><description>&lt;h2 id="prerequisites"&gt;Prerequisites&lt;/h2&gt;
&lt;p&gt;Before installing function-hcl you need:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A Kubernetes cluster with &lt;a href="https://docs.crossplane.io/latest/software/install/"&gt;Crossplane&lt;/a&gt; v1.14 or later installed.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;kubectl&lt;/code&gt; configured to point at your cluster.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="install-via-crossplane-package"&gt;Install via Crossplane Package&lt;/h2&gt;
&lt;p&gt;The recommended way to install function-hcl is as a Crossplane Function package:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;apiVersion&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;pkg.crossplane.io/v1&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;kind&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;Function&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;function-hcl&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;spec&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;package&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;xpkg.upbound.io/crossplane-contrib/function-hcl:v0.2.0-rc9&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Apply it to your cluster:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kubectl apply -f &lt;span class="k"&gt;function&lt;/span&gt;.yaml
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Verify the function is healthy:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kubectl get &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt;-hcl
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;You should see &lt;code&gt;HEALTHY: True&lt;/code&gt; and &lt;code&gt;INSTALLED: True&lt;/code&gt; in the output.&lt;/p&gt;</description></item><item><title>Source Format</title><link>https://crossplane-contrib.github.io/function-hcl/docs/language-guide/source-format/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://crossplane-contrib.github.io/function-hcl/docs/language-guide/source-format/</guid><description>&lt;h2 id="hcl-syntax"&gt;HCL Syntax&lt;/h2&gt;
&lt;p&gt;function-hcl source code is written in &lt;a href="https://github.com/hashicorp/hcl/blob/main/hclsyntax/spec.md"&gt;HCL syntax&lt;/a&gt;.
Code may be spread across multiple files &amp;ndash; all files are treated as one unit. The only difference between
having multiple files versus a single file is that line numbers will differ in error messages.&lt;/p&gt;
&lt;h2 id="txtar-format"&gt;txtar Format&lt;/h2&gt;
&lt;p&gt;The function accepts its input as text in the &lt;code&gt;input&lt;/code&gt; field of a Composition pipeline step.
This &lt;strong&gt;must&lt;/strong&gt; be in &lt;a href="https://pkg.go.dev/golang.org/x/tools/txtar#hdr-Txtar_format"&gt;txtar format&lt;/a&gt;
so that original file names are maintained and line numbers match the source code.&lt;/p&gt;</description></item><item><title>Built-in Functions</title><link>https://crossplane-contrib.github.io/function-hcl/docs/reference/built-in-functions/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://crossplane-contrib.github.io/function-hcl/docs/reference/built-in-functions/</guid><description>&lt;p&gt;function-hcl supports most Terraform functions as of v1.5.7. Exceptions are noted at the end of the page.&lt;/p&gt;
&lt;h2 id="available-functions-by-category"&gt;Available Functions by Category&lt;/h2&gt;
&lt;h3 id="numeric"&gt;Numeric&lt;/h3&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Function&lt;/th&gt;
 &lt;th&gt;Description&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;a href="https://developer.hashicorp.com/terraform/language/v1.5.x/functions/abs"&gt;&lt;code&gt;abs(n)&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;Absolute value&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;a href="https://developer.hashicorp.com/terraform/language/v1.5.x/functions/ceil"&gt;&lt;code&gt;ceil(n)&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;Round up to nearest integer&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;a href="https://developer.hashicorp.com/terraform/language/v1.5.x/functions/floor"&gt;&lt;code&gt;floor(n)&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;Round down to nearest integer&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;a href="https://developer.hashicorp.com/terraform/language/v1.5.x/functions/log"&gt;&lt;code&gt;log(n, base)&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;Logarithm&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;a href="https://developer.hashicorp.com/terraform/language/v1.5.x/functions/max"&gt;&lt;code&gt;max(n1, n2, ...)&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;Maximum value&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;a href="https://developer.hashicorp.com/terraform/language/v1.5.x/functions/min"&gt;&lt;code&gt;min(n1, n2, ...)&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;Minimum value&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;a href="https://developer.hashicorp.com/terraform/language/v1.5.x/functions/parseint"&gt;&lt;code&gt;parseint(str, base)&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;Parse integer from string&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;a href="https://developer.hashicorp.com/terraform/language/v1.5.x/functions/pow"&gt;&lt;code&gt;pow(base, exp)&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;Exponentiation&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;a href="https://developer.hashicorp.com/terraform/language/v1.5.x/functions/signum"&gt;&lt;code&gt;signum(n)&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;Sign of number (-1, 0, 1)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="string"&gt;String&lt;/h3&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Function&lt;/th&gt;
 &lt;th&gt;Description&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;a href="https://developer.hashicorp.com/terraform/language/v1.5.x/functions/chomp"&gt;&lt;code&gt;chomp(str)&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;Remove trailing newlines&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;a href="https://developer.hashicorp.com/terraform/language/v1.5.x/functions/endswith"&gt;&lt;code&gt;endswith(str, suffix)&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;Check suffix&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;a href="https://developer.hashicorp.com/terraform/language/v1.5.x/functions/format"&gt;&lt;code&gt;format(fmt, args...)&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;String formatting (sprintf-style)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;a href="https://developer.hashicorp.com/terraform/language/v1.5.x/functions/formatlist"&gt;&lt;code&gt;formatlist(fmt, list...)&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;Format each element&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;a href="https://developer.hashicorp.com/terraform/language/v1.5.x/functions/indent"&gt;&lt;code&gt;indent(spaces, str)&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;Indent all lines&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;a href="https://developer.hashicorp.com/terraform/language/v1.5.x/functions/join"&gt;&lt;code&gt;join(sep, list)&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;Join list elements&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;a href="https://developer.hashicorp.com/terraform/language/v1.5.x/functions/lower"&gt;&lt;code&gt;lower(str)&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;Lowercase&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;a href="https://developer.hashicorp.com/terraform/language/v1.5.x/functions/regex"&gt;&lt;code&gt;regex(pattern, str)&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;Regex match&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;a href="https://developer.hashicorp.com/terraform/language/v1.5.x/functions/regexall"&gt;&lt;code&gt;regexall(pattern, str)&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;All regex matches&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;a href="https://developer.hashicorp.com/terraform/language/v1.5.x/functions/replace"&gt;&lt;code&gt;replace(str, old, new)&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;String replacement&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;a href="https://developer.hashicorp.com/terraform/language/v1.5.x/functions/split"&gt;&lt;code&gt;split(sep, str)&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;Split string&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;a href="https://developer.hashicorp.com/terraform/language/v1.5.x/functions/startswith"&gt;&lt;code&gt;startswith(str, prefix)&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;Check prefix&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;a href="https://developer.hashicorp.com/terraform/language/v1.5.x/functions/strrev"&gt;&lt;code&gt;strrev(str)&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;Reverse string&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;a href="https://developer.hashicorp.com/terraform/language/v1.5.x/functions/substr"&gt;&lt;code&gt;substr(str, offset, length)&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;Substring&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;a href="https://developer.hashicorp.com/terraform/language/v1.5.x/functions/title"&gt;&lt;code&gt;title(str)&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;Title case&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;a href="https://developer.hashicorp.com/terraform/language/v1.5.x/functions/trim"&gt;&lt;code&gt;trim(str, chars)&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;Trim characters&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;a href="https://developer.hashicorp.com/terraform/language/v1.5.x/functions/trimprefix"&gt;&lt;code&gt;trimprefix(str, prefix)&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;Trim prefix&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;a href="https://developer.hashicorp.com/terraform/language/v1.5.x/functions/trimsuffix"&gt;&lt;code&gt;trimsuffix(str, suffix)&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;Trim suffix&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;a href="https://developer.hashicorp.com/terraform/language/v1.5.x/functions/trimspace"&gt;&lt;code&gt;trimspace(str)&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;Trim whitespace&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;a href="https://developer.hashicorp.com/terraform/language/v1.5.x/functions/upper"&gt;&lt;code&gt;upper(str)&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;Uppercase&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="collection"&gt;Collection&lt;/h3&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Function&lt;/th&gt;
 &lt;th&gt;Description&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;a href="https://developer.hashicorp.com/terraform/language/v1.5.x/functions/alltrue"&gt;&lt;code&gt;alltrue(list)&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;All elements are true&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;a href="https://developer.hashicorp.com/terraform/language/v1.5.x/functions/anytrue"&gt;&lt;code&gt;anytrue(list)&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;Any element is true&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;a href="https://developer.hashicorp.com/terraform/language/v1.5.x/functions/chunklist"&gt;&lt;code&gt;chunklist(list, size)&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;Split list into chunks&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;a href="https://developer.hashicorp.com/terraform/language/v1.5.x/functions/coalesce"&gt;&lt;code&gt;coalesce(vals...)&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;First non-null, non-empty value&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;a href="https://developer.hashicorp.com/terraform/language/v1.5.x/functions/coalescelist"&gt;&lt;code&gt;coalescelist(lists...)&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;First non-empty list&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;a href="https://developer.hashicorp.com/terraform/language/v1.5.x/functions/compact"&gt;&lt;code&gt;compact(list)&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;Remove empty strings&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;a href="https://developer.hashicorp.com/terraform/language/v1.5.x/functions/concat"&gt;&lt;code&gt;concat(lists...)&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;Concatenate lists&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;a href="https://developer.hashicorp.com/terraform/language/v1.5.x/functions/contains"&gt;&lt;code&gt;contains(list, val)&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;Check membership&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;a href="https://developer.hashicorp.com/terraform/language/v1.5.x/functions/distinct"&gt;&lt;code&gt;distinct(list)&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;Remove duplicates&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;a href="https://developer.hashicorp.com/terraform/language/v1.5.x/functions/element"&gt;&lt;code&gt;element(list, idx)&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;Get element by index (wraps)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;a href="https://developer.hashicorp.com/terraform/language/v1.5.x/functions/flatten"&gt;&lt;code&gt;flatten(list)&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;Flatten nested lists&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;a href="https://developer.hashicorp.com/terraform/language/v1.5.x/functions/index"&gt;&lt;code&gt;index(list, val)&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;Find index of value&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;a href="https://developer.hashicorp.com/terraform/language/v1.5.x/functions/keys"&gt;&lt;code&gt;keys(map)&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;Map keys&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;a href="https://developer.hashicorp.com/terraform/language/v1.5.x/functions/length"&gt;&lt;code&gt;length(val)&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;Length of string, list, or map&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;a href="https://developer.hashicorp.com/terraform/language/v1.5.x/functions/list"&gt;&lt;code&gt;list(vals...)&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;Create a list&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;a href="https://developer.hashicorp.com/terraform/language/v1.5.x/functions/lookup"&gt;&lt;code&gt;lookup(map, key, default)&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;Safe map lookup&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;a href="https://developer.hashicorp.com/terraform/language/v1.5.x/functions/map"&gt;&lt;code&gt;map(k1, v1, k2, v2, ...)&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;Create a map&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;a href="https://developer.hashicorp.com/terraform/language/v1.5.x/functions/matchkeys"&gt;&lt;code&gt;matchkeys(vals, keys, search)&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;Filter by matching keys&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;a href="https://developer.hashicorp.com/terraform/language/v1.5.x/functions/merge"&gt;&lt;code&gt;merge(maps...)&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;Merge maps&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;a href="https://developer.hashicorp.com/terraform/language/v1.5.x/functions/one"&gt;&lt;code&gt;one(list)&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;Extract single element or null&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;a href="https://developer.hashicorp.com/terraform/language/v1.5.x/functions/range"&gt;&lt;code&gt;range(start, limit, step)&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;Generate number sequence&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;a href="https://developer.hashicorp.com/terraform/language/v1.5.x/functions/reverse"&gt;&lt;code&gt;reverse(list)&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;Reverse list&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;a href="https://developer.hashicorp.com/terraform/language/v1.5.x/functions/setintersection"&gt;&lt;code&gt;setintersection(sets...)&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;Set intersection&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;a href="https://developer.hashicorp.com/terraform/language/v1.5.x/functions/setproduct"&gt;&lt;code&gt;setproduct(sets...)&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;Cartesian product&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;a href="https://developer.hashicorp.com/terraform/language/v1.5.x/functions/setsubtract"&gt;&lt;code&gt;setsubtract(a, b)&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;Set difference&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;a href="https://developer.hashicorp.com/terraform/language/v1.5.x/functions/setunion"&gt;&lt;code&gt;setunion(sets...)&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;Set union&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;a href="https://developer.hashicorp.com/terraform/language/v1.5.x/functions/slice"&gt;&lt;code&gt;slice(list, start, end)&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;List slice&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;a href="https://developer.hashicorp.com/terraform/language/v1.5.x/functions/sort"&gt;&lt;code&gt;sort(list)&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;Sort strings lexicographically&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;a href="https://developer.hashicorp.com/terraform/language/v1.5.x/functions/sum"&gt;&lt;code&gt;sum(list)&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;Sum numbers&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;a href="https://developer.hashicorp.com/terraform/language/v1.5.x/functions/transpose"&gt;&lt;code&gt;transpose(map)&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;Transpose map of lists&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;a href="https://developer.hashicorp.com/terraform/language/v1.5.x/functions/values"&gt;&lt;code&gt;values(map)&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;Map values&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;a href="https://developer.hashicorp.com/terraform/language/v1.5.x/functions/zipmap"&gt;&lt;code&gt;zipmap(keys, values)&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;Create map from key/value lists&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="encoding"&gt;Encoding&lt;/h3&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Function&lt;/th&gt;
 &lt;th&gt;Description&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;a href="https://developer.hashicorp.com/terraform/language/v1.5.x/functions/base64decode"&gt;&lt;code&gt;base64decode(str)&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;Decode base64&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;a href="https://developer.hashicorp.com/terraform/language/v1.5.x/functions/base64encode"&gt;&lt;code&gt;base64encode(str)&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;Encode to base64&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;a href="https://developer.hashicorp.com/terraform/language/v1.5.x/functions/base64gzip"&gt;&lt;code&gt;base64gzip(str)&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;Gzip then base64 encode&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;a href="https://developer.hashicorp.com/terraform/language/v1.5.x/functions/csvdecode"&gt;&lt;code&gt;csvdecode(str)&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;Parse CSV&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;a href="https://developer.hashicorp.com/terraform/language/v1.5.x/functions/jsondecode"&gt;&lt;code&gt;jsondecode(str)&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;Parse JSON&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;a href="https://developer.hashicorp.com/terraform/language/v1.5.x/functions/jsonencode"&gt;&lt;code&gt;jsonencode(val)&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;Encode to JSON&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;a href="https://developer.hashicorp.com/terraform/language/v1.5.x/functions/textdecodebase64"&gt;&lt;code&gt;textdecodebase64(str, enc)&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;Decode base64 with encoding&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;a href="https://developer.hashicorp.com/terraform/language/v1.5.x/functions/textencodebase64"&gt;&lt;code&gt;textencodebase64(str, enc)&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;Encode with encoding then base64&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;a href="https://developer.hashicorp.com/terraform/language/v1.5.x/functions/urlencode"&gt;&lt;code&gt;urlencode(str)&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;URL encode&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;a href="https://developer.hashicorp.com/terraform/language/v1.5.x/functions/yamldecode"&gt;&lt;code&gt;yamldecode(str)&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;Parse YAML&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;a href="https://developer.hashicorp.com/terraform/language/v1.5.x/functions/yamlencode"&gt;&lt;code&gt;yamlencode(val)&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;Encode to YAML&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="hash-and-crypto"&gt;Hash and Crypto&lt;/h3&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Function&lt;/th&gt;
 &lt;th&gt;Description&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;a href="https://developer.hashicorp.com/terraform/language/v1.5.x/functions/base64sha256"&gt;&lt;code&gt;base64sha256(str)&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;Base64-encoded SHA256&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;a href="https://developer.hashicorp.com/terraform/language/v1.5.x/functions/base64sha512"&gt;&lt;code&gt;base64sha512(str)&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;Base64-encoded SHA512&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;a href="https://developer.hashicorp.com/terraform/language/v1.5.x/functions/md5"&gt;&lt;code&gt;md5(str)&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;MD5 hash&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;a href="https://developer.hashicorp.com/terraform/language/v1.5.x/functions/sha1"&gt;&lt;code&gt;sha1(str)&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;SHA1 hash&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;a href="https://developer.hashicorp.com/terraform/language/v1.5.x/functions/sha256"&gt;&lt;code&gt;sha256(str)&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;SHA256 hash&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;a href="https://developer.hashicorp.com/terraform/language/v1.5.x/functions/sha512"&gt;&lt;code&gt;sha512(str)&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;SHA512 hash&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="ip-network"&gt;IP Network&lt;/h3&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Function&lt;/th&gt;
 &lt;th&gt;Description&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;a href="https://developer.hashicorp.com/terraform/language/v1.5.x/functions/cidrhost"&gt;&lt;code&gt;cidrhost(prefix, hostnum)&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;Calculate host IP&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;a href="https://developer.hashicorp.com/terraform/language/v1.5.x/functions/cidrnetmask"&gt;&lt;code&gt;cidrnetmask(prefix)&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;Network mask&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;a href="https://developer.hashicorp.com/terraform/language/v1.5.x/functions/cidrsubnet"&gt;&lt;code&gt;cidrsubnet(prefix, newbits, netnum)&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;Calculate subnet&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;a href="https://developer.hashicorp.com/terraform/language/v1.5.x/functions/cidrsubnets"&gt;&lt;code&gt;cidrsubnets(prefix, newbits...)&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;Calculate multiple subnets&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="type-conversion"&gt;Type Conversion&lt;/h3&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Function&lt;/th&gt;
 &lt;th&gt;Description&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;a href="https://developer.hashicorp.com/terraform/language/v1.5.x/functions/can"&gt;&lt;code&gt;can(expr)&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;Test if expression evaluates without error&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;a href="https://developer.hashicorp.com/terraform/language/v1.5.x/functions/nonsensitive"&gt;&lt;code&gt;nonsensitive(val)&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;Remove sensitive marking&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;a href="https://developer.hashicorp.com/terraform/language/v1.5.x/functions/sensitive"&gt;&lt;code&gt;sensitive(val)&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;Mark as sensitive&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;a href="https://developer.hashicorp.com/terraform/language/v1.5.x/functions/tobool"&gt;&lt;code&gt;tobool(val)&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;Convert to bool&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;a href="https://developer.hashicorp.com/terraform/language/v1.5.x/functions/tolist"&gt;&lt;code&gt;tolist(val)&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;Convert to list&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;a href="https://developer.hashicorp.com/terraform/language/v1.5.x/functions/tomap"&gt;&lt;code&gt;tomap(val)&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;Convert to map&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;a href="https://developer.hashicorp.com/terraform/language/v1.5.x/functions/tonumber"&gt;&lt;code&gt;tonumber(val)&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;Convert to number&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;a href="https://developer.hashicorp.com/terraform/language/v1.5.x/functions/toset"&gt;&lt;code&gt;toset(val)&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;Convert to set&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;a href="https://developer.hashicorp.com/terraform/language/v1.5.x/functions/tostring"&gt;&lt;code&gt;tostring(val)&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;Convert to string&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;a href="https://developer.hashicorp.com/terraform/language/v1.5.x/functions/try"&gt;&lt;code&gt;try(exprs...)&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;First expression that doesn&amp;rsquo;t error&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;a href="https://developer.hashicorp.com/terraform/language/v1.5.x/functions/type"&gt;&lt;code&gt;type(val)&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;Get type of value&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="custom-functions"&gt;Custom Functions&lt;/h2&gt;
&lt;h3 id="invoke"&gt;&lt;code&gt;invoke&lt;/code&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-hcl" data-lang="hcl"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;invoke&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;functionName&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; { &lt;span class="k"&gt;arg1&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="k"&gt;value1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;arg2&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="k"&gt;value2&lt;/span&gt; }&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Calls a &lt;a href="../../language-guide/user-functions/"&gt;user-defined function&lt;/a&gt;. The first argument must be
a static string. See the language guide for details.&lt;/p&gt;</description></item><item><title>Deferred Rendering</title><link>https://crossplane-contrib.github.io/function-hcl/docs/concepts/deferred-rendering/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://crossplane-contrib.github.io/function-hcl/docs/concepts/deferred-rendering/</guid><description>&lt;p&gt;Deferred rendering is the headline feature of function-hcl. It eliminates the boilerplate
conditional logic that is common in Crossplane compositions.&lt;/p&gt;
&lt;h2 id="the-problem"&gt;The Problem&lt;/h2&gt;
&lt;p&gt;In a typical Crossplane composition, if resource B uses a status field from resource A, you need to handle
the case where resource A hasn&amp;rsquo;t been created yet. This often requires conditional logic
scattered throughout your composition.&lt;/p&gt;
&lt;h2 id="how-function-hcl-solves-it"&gt;How function-hcl Solves It&lt;/h2&gt;
&lt;p&gt;function-hcl uses a simple rule: if &lt;strong&gt;any expression&lt;/strong&gt; in a block evaluates to an
&lt;a href="../../language-guide/hcl-basics/#incomplete-values"&gt;incomplete value&lt;/a&gt; (null, missing attribute,
missing index), the &lt;strong&gt;entire block is deferred&lt;/strong&gt; — dropped from the output for that reconcile cycle.&lt;/p&gt;</description></item><item><title>Gotchas</title><link>https://crossplane-contrib.github.io/function-hcl/docs/tips-and-pitfalls/gotchas/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://crossplane-contrib.github.io/function-hcl/docs/tips-and-pitfalls/gotchas/</guid><description>&lt;h2 id="dashes-in-identifiers-mean-you-cant-subtract-without-spaces"&gt;Dashes in identifiers mean you can&amp;rsquo;t subtract without spaces&lt;/h2&gt;
&lt;p&gt;HCL allows dashes in identifiers. This means &lt;code&gt;a-b&lt;/code&gt; is a single identifier, not &lt;code&gt;a&lt;/code&gt; minus &lt;code&gt;b&lt;/code&gt;.
Use spaces for arithmetic: &lt;code&gt;a - b&lt;/code&gt;.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-hcl" data-lang="hcl"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;locals&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt; my-var&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="m"&gt;10&lt;/span&gt;&lt;span class="c1"&gt; # this is a variable named &amp;#34;my-var&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt; result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;my&lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="k"&gt;var&lt;/span&gt;&lt;span class="c1"&gt; # refers to the variable, not &amp;#34;my&amp;#34; minus &amp;#34;var&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt; diff&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;a&lt;/span&gt; &lt;span class="err"&gt;-&lt;/span&gt; &lt;span class="k"&gt;b&lt;/span&gt;&lt;span class="c1"&gt; # subtraction -- spaces required
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="body-is-an-attribute-not-a-block"&gt;body is an attribute, not a block&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;body&lt;/code&gt; must use &lt;code&gt;=&lt;/code&gt; for assignment. Omitting &lt;code&gt;=&lt;/code&gt; turns it into a block, which is a different
HCL construct and will produce a schema error.&lt;/p&gt;</description></item><item><title>HCL Basics</title><link>https://crossplane-contrib.github.io/function-hcl/docs/language-guide/hcl-basics/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://crossplane-contrib.github.io/function-hcl/docs/language-guide/hcl-basics/</guid><description>&lt;p&gt;Before diving into function-hcl specifics, it helps to understand the fundamental building blocks of
HCL syntax. This page covers the essentials; for the full language specification see the
&lt;a href="https://github.com/hashicorp/hcl/blob/main/hclsyntax/spec.md"&gt;HCL Native Syntax Specification&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;People who have worked with Terraform before should feel free to skip this section.&lt;/p&gt;
&lt;h2 id="blocks"&gt;Blocks&lt;/h2&gt;
&lt;p&gt;A block is a container that has a &lt;strong&gt;type&lt;/strong&gt;, zero or more &lt;strong&gt;labels&lt;/strong&gt;, and a &lt;strong&gt;body&lt;/strong&gt; enclosed
in braces. The body contains attributes and/or nested blocks.&lt;/p&gt;</description></item><item><title>Quickstart</title><link>https://crossplane-contrib.github.io/function-hcl/docs/getting-started/quickstart/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://crossplane-contrib.github.io/function-hcl/docs/getting-started/quickstart/</guid><description>&lt;p&gt;This quickstart creates a simple composition that provisions an S3 bucket using function-hcl.&lt;/p&gt;
&lt;h2 id="1-define-a-composite-resource"&gt;1. Define a Composite Resource&lt;/h2&gt;
&lt;p&gt;First, define an XRD and a Claim type for a storage bucket:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;apiVersion&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;apiextensions.crossplane.io/v1&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;kind&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;CompositeResourceDefinition&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;xstoragebuckets.example.crossplane.io&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;spec&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;group&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;example.crossplane.io&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;names&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;kind&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;XStorageBucket&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;plural&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;xstoragebuckets&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;claimNames&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;kind&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;StorageBucket&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;plural&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;storagebuckets&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;versions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;v1&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;served&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;referenceable&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;schema&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;openAPIV3Schema&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;object&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;spec&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;object&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;parameters&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;object&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;required&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="l"&gt;region]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;region&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;string&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;AWS region for the bucket&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;status&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;object&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;bucketArn&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;string&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Apply it:&lt;/p&gt;</description></item><item><title>Error Conditions</title><link>https://crossplane-contrib.github.io/function-hcl/docs/reference/error-conditions/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://crossplane-contrib.github.io/function-hcl/docs/reference/error-conditions/</guid><description>&lt;p&gt;The following conditions are treated as errors by function-hcl. When an error occurs, the function
returns a &lt;code&gt;Fatal&lt;/code&gt; result that surfaces on the composite resource.&lt;/p&gt;
&lt;h2 id="parsing-errors"&gt;Parsing Errors&lt;/h2&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Error&lt;/th&gt;
 &lt;th&gt;Description&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;HCL syntax error&lt;/td&gt;
 &lt;td&gt;Invalid HCL syntax in the source files&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Schema violation&lt;/td&gt;
 &lt;td&gt;Block structure doesn&amp;rsquo;t match the expected schema&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="variable-errors"&gt;Variable Errors&lt;/h2&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Error&lt;/th&gt;
 &lt;th&gt;Description&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;Unknown local variable&lt;/td&gt;
 &lt;td&gt;Reference to a local variable name that doesn&amp;rsquo;t exist&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Circular reference&lt;/td&gt;
 &lt;td&gt;Circular dependencies in locals (e.g. &lt;code&gt;locals { a = b; b = a }&lt;/code&gt;)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Local shadowing&lt;/td&gt;
 &lt;td&gt;A local variable in an inner scope has the same name as one in a parent scope&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="resource-errors"&gt;Resource Errors&lt;/h2&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Error&lt;/th&gt;
 &lt;th&gt;Description&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;Duplicate resource name&lt;/td&gt;
 &lt;td&gt;Two resources produce the same crossplane name&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Existing resource became incomplete&lt;/td&gt;
 &lt;td&gt;A resource that exists in the observed state now has an incomplete value. This is a safety check to prevent accidental deletion.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="condition-errors"&gt;Condition Errors&lt;/h2&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Error&lt;/th&gt;
 &lt;th&gt;Description&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;Incomplete condition&lt;/td&gt;
 &lt;td&gt;A &lt;code&gt;condition&lt;/code&gt; value that cannot be evaluated (note: incomplete conditions are treated as &lt;code&gt;false&lt;/code&gt;, but certain evaluation failures are errors)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Non-boolean condition&lt;/td&gt;
 &lt;td&gt;A &lt;code&gt;condition&lt;/code&gt; evaluates to something other than &lt;code&gt;true&lt;/code&gt; or &lt;code&gt;false&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="status-and-connection-errors"&gt;Status and Connection Errors&lt;/h2&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Error&lt;/th&gt;
 &lt;th&gt;Description&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;Conflicting status values&lt;/td&gt;
 &lt;td&gt;Two &lt;code&gt;composite status&lt;/code&gt; blocks set the same non-object leaf attribute to different values&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Conflicting connection values&lt;/td&gt;
 &lt;td&gt;Two &lt;code&gt;composite connection&lt;/code&gt; blocks set the same key to different values&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Non-string connection value&lt;/td&gt;
 &lt;td&gt;A connection detail value is not a base64-encoded string&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="requirement-errors"&gt;Requirement Errors&lt;/h2&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Error&lt;/th&gt;
 &lt;th&gt;Description&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;Both matchName and matchLabels&lt;/td&gt;
 &lt;td&gt;A &lt;code&gt;requirement&lt;/code&gt; block specifies both selection methods&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Neither matchName nor matchLabels&lt;/td&gt;
 &lt;td&gt;A &lt;code&gt;requirement&lt;/code&gt; block specifies no selection method&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Type mismatch&lt;/td&gt;
 &lt;td&gt;Data type mismatch in &lt;code&gt;select&lt;/code&gt; attributes&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="function-errors"&gt;Function Errors&lt;/h2&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Error&lt;/th&gt;
 &lt;th&gt;Description&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;Invalid function name&lt;/td&gt;
 &lt;td&gt;A &lt;code&gt;function&lt;/code&gt; or &lt;code&gt;arg&lt;/code&gt; has a name that is not a valid identifier&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Unknown function&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;invoke&lt;/code&gt; references a non-existent function&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Bad invocation&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;invoke&lt;/code&gt; called with missing required arguments or unrecognized argument names&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Stack overflow&lt;/td&gt;
 &lt;td&gt;Call stack exceeds 100 frames (infinite recursion protection)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="context-errors"&gt;Context Errors&lt;/h2&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Error&lt;/th&gt;
 &lt;th&gt;Description&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;Conflicting context values&lt;/td&gt;
 &lt;td&gt;Two &lt;code&gt;context&lt;/code&gt; blocks write different non-object values to the same key path&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;</description></item><item><title>IDE Setup</title><link>https://crossplane-contrib.github.io/function-hcl/docs/getting-started/ide-setup/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://crossplane-contrib.github.io/function-hcl/docs/getting-started/ide-setup/</guid><description>&lt;p&gt;function-hcl has a language server (&lt;code&gt;function-hcl-ls&lt;/code&gt;) that provides IDE features for &lt;code&gt;.hcl&lt;/code&gt; files
used in function-hcl compositions. Extensions are available for VS Code and IntelliJ.&lt;/p&gt;
&lt;h2 id="features"&gt;Features&lt;/h2&gt;
&lt;p&gt;The language server provides:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Code completion&lt;/li&gt;
&lt;li&gt;Diagnostics (error reporting)&lt;/li&gt;
&lt;li&gt;Hover information&lt;/li&gt;
&lt;li&gt;Go to definition&lt;/li&gt;
&lt;li&gt;Document symbols&lt;/li&gt;
&lt;li&gt;Semantic token highlighting&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="installation-instructions"&gt;Installation instructions&lt;/h2&gt;
&lt;p&gt;Coming soon. Watch this space&amp;hellip;&lt;/p&gt;</description></item><item><title>The req Variable</title><link>https://crossplane-contrib.github.io/function-hcl/docs/language-guide/variables/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://crossplane-contrib.github.io/function-hcl/docs/language-guide/variables/</guid><description>&lt;p&gt;function-hcl provides a built-in &lt;code&gt;req&lt;/code&gt; variable that gives you access to the Crossplane request
state. It is available everywhere in the script &amp;ndash; top-level locals, resource blocks, groups,
and nested blocks.&lt;/p&gt;
&lt;h2 id="fields"&gt;Fields&lt;/h2&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Expression&lt;/th&gt;
 &lt;th&gt;Type&lt;/th&gt;
 &lt;th&gt;Description&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;req.composite&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;k8s object&lt;/td&gt;
 &lt;td&gt;The observed composite resource (XR)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;req.composite_connection&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;map(string, bytes)&lt;/td&gt;
 &lt;td&gt;Connection details of the composite resource&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;req.resource&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;map(string, k8s object)&lt;/td&gt;
 &lt;td&gt;Observed composed resources, keyed by crossplane resource name&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;req.connection&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;map(string, map(string, bytes))&lt;/td&gt;
 &lt;td&gt;Connection details of observed resources, keyed by resource name&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;req.resources&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;map(string, list(k8s object))&lt;/td&gt;
 &lt;td&gt;Observed resource collections, keyed by collection base name&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;req.connections&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;map(string, list(map(string, bytes)))&lt;/td&gt;
 &lt;td&gt;Connection details of resource collections&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;req.context&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;map(string, any)&lt;/td&gt;
 &lt;td&gt;Pipeline context values from upstream functions&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;req.extra_resources&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;map(string, list(k8s object))&lt;/td&gt;
 &lt;td&gt;Extra resources fetched via &lt;code&gt;requirement&lt;/code&gt; blocks&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="example"&gt;Example&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-hcl" data-lang="hcl"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;locals&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt; comp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;composite&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt; compName&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;comp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;name&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt; params&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;comp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;spec&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;parameters&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt; region&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;params&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;region&lt;/span&gt;&lt;span class="c1"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt; # Access an observed resource by its crossplane name
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt; observedBucket&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;resource&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;my&lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="k"&gt;bucket&lt;/span&gt;&lt;span class="c1"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt; # Access pipeline context
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt; upstreamValue&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;context&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;upstream-function/some-key&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="accessing-observed-resources"&gt;Accessing Observed Resources&lt;/h2&gt;
&lt;p&gt;Use &lt;code&gt;req.resource.&amp;lt;name&amp;gt;&lt;/code&gt; to access any observed composed resource by its crossplane name.
This is useful when one resource needs to reference the status of another:&lt;/p&gt;</description></item><item><title>fn-hcl-tools CLI</title><link>https://crossplane-contrib.github.io/function-hcl/docs/reference/fn-hcl-tools/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://crossplane-contrib.github.io/function-hcl/docs/reference/fn-hcl-tools/</guid><description>&lt;p&gt;&lt;code&gt;fn-hcl-tools&lt;/code&gt; is a companion CLI for function-hcl that helps package, format, and analyze
HCL compositions.&lt;/p&gt;
&lt;h2 id="installation"&gt;Installation&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;go install github.com/crossplane-contrib/function-hcl/function-hcl/cmd/fn-hcl-tools@v0.2.0-rc9
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="commands"&gt;Commands&lt;/h2&gt;
&lt;h3 id="package"&gt;&lt;code&gt;package&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Packages a directory of HCL files into a single txtar bundle, suitable for embedding in a Composition&amp;rsquo;s
&lt;code&gt;input&lt;/code&gt; field.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;fn-hcl-tools package *.hcl
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The tool runs basic static analysis on the HCL before packing, catching syntax errors early.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Given a directory:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;my-composition/
 main.hcl
 bucket.hcl
 database.hcl
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Run:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;fn-hcl-tools package my-composition/*.hcl
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Output (suitable for pasting into a Composition YAML &lt;code&gt;input&lt;/code&gt; field):&lt;/p&gt;</description></item><item><title>Local Variables</title><link>https://crossplane-contrib.github.io/function-hcl/docs/language-guide/local-variables/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://crossplane-contrib.github.io/function-hcl/docs/language-guide/local-variables/</guid><description>&lt;p&gt;Local variables in function-hcl work like Terraform locals, with some important differences.&lt;/p&gt;
&lt;h2 id="basics"&gt;Basics&lt;/h2&gt;
&lt;p&gt;Define locals in a &lt;code&gt;locals&lt;/code&gt; block. Access them directly by name &amp;ndash; no &lt;code&gt;local.&lt;/code&gt; prefix needed.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-hcl" data-lang="hcl"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;locals&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt; baseName&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;composite&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;name&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt; computedName&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;${baseName}-bucket&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="ordering-doesnt-matter"&gt;Ordering Doesn&amp;rsquo;t Matter&lt;/h2&gt;
&lt;p&gt;All &lt;code&gt;locals&lt;/code&gt; blocks in a given scope are processed together and variable ordering doesn&amp;rsquo;t matter.
Dependencies are resolved automatically. This is the same behavior as Terraform.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-hcl" data-lang="hcl"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# These two blocks are treated identically:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;locals&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt; computedName&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;${baseName}-bucket&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;locals&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt; baseName&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;composite&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;name&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Circular references (e.g. &lt;code&gt;locals { a = b; b = a }&lt;/code&gt;) are an error.&lt;/p&gt;</description></item><item><title>Resource Blocks</title><link>https://crossplane-contrib.github.io/function-hcl/docs/language-guide/resource-blocks/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://crossplane-contrib.github.io/function-hcl/docs/language-guide/resource-blocks/</guid><description>&lt;p&gt;The &lt;code&gt;resource&lt;/code&gt; block is the primary way to declare a desired composed resource.&lt;/p&gt;
&lt;h2 id="syntax"&gt;Syntax&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-hcl" data-lang="hcl"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;resource&lt;/span&gt; &lt;span class="err"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;crossplane&lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="k"&gt;name&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;locals&lt;/span&gt; { &lt;span class="p"&gt;...&lt;/span&gt; }&lt;span class="c1"&gt; # optional: resource-scoped locals
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt; body&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; { &lt;span class="p"&gt;...&lt;/span&gt; }&lt;span class="c1"&gt; # required: the Kubernetes manifest
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;composite&lt;/span&gt; &lt;span class="k"&gt;status&lt;/span&gt; { }&lt;span class="c1"&gt; # optional: write to composite status
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;composite&lt;/span&gt; &lt;span class="k"&gt;connection&lt;/span&gt; { }&lt;span class="c1"&gt; # optional: write connection details
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;ready&lt;/span&gt; { }&lt;span class="c1"&gt; # optional: set readiness
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="the-body-attribute"&gt;The &lt;code&gt;body&lt;/code&gt; Attribute&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;body&lt;/code&gt; is an HCL object expression that produces the full Kubernetes manifest for the composed resource.
It must be assigned with &lt;code&gt;=&lt;/code&gt;.&lt;/p&gt;</description></item><item><title>Resource Collections</title><link>https://crossplane-contrib.github.io/function-hcl/docs/language-guide/resource-collections/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://crossplane-contrib.github.io/function-hcl/docs/language-guide/resource-collections/</guid><description>&lt;p&gt;The &lt;code&gt;resources&lt;/code&gt; (plural) block creates multiple resources by iterating over a collection.&lt;/p&gt;
&lt;h2 id="syntax"&gt;Syntax&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-hcl" data-lang="hcl"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;resources&lt;/span&gt; &lt;span class="err"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;base&lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="k"&gt;name&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;locals&lt;/span&gt; { &lt;span class="p"&gt;...&lt;/span&gt; }&lt;span class="c1"&gt; # optional: collection-scoped locals
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt; for_each&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="err"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;expression&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;&lt;/span&gt;&lt;span class="c1"&gt; # required: list, set, or map to iterate over
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt; name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="err"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;expression&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;&lt;/span&gt;&lt;span class="c1"&gt; # optional: how to generate each crossplane name
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt; # default: &amp;#34;${self.basename}-${each.key}&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;template&lt;/span&gt; {&lt;span class="c1"&gt; # required: the template for each resource
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;locals&lt;/span&gt; { &lt;span class="p"&gt;...&lt;/span&gt; }&lt;span class="c1"&gt; # optional: template-scoped locals
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt; body&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; { &lt;span class="p"&gt;...&lt;/span&gt; }&lt;span class="c1"&gt; # required: the Kubernetes manifest
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;composite&lt;/span&gt; &lt;span class="k"&gt;status&lt;/span&gt; { }&lt;span class="c1"&gt; # optional
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;composite&lt;/span&gt; &lt;span class="k"&gt;connection&lt;/span&gt; { }&lt;span class="c1"&gt; # optional
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;ready&lt;/span&gt; { }&lt;span class="c1"&gt; # optional
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="example"&gt;Example&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-hcl" data-lang="hcl"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;resources&lt;/span&gt; &lt;span class="k"&gt;additional_buckets&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;locals&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt; params&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;composite&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;spec&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;parameters&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt; suffixes&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;params&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;suffixes&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt; for_each&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;suffixes&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;template&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;locals&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt; resourceName&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;${req.composite.metadata.name}-${self.name}&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt; body&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt; apiVersion&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;s3.aws.upbound.io/v1beta1&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt; kind&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Bucket&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt; metadata&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt; name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;resourceName&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt; spec&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt; forProvider&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt; forceDestroy&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt; region&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;params&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;region&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="the-for_each-attribute"&gt;The &lt;code&gt;for_each&lt;/code&gt; Attribute&lt;/h2&gt;
&lt;p&gt;Must evaluate to a list, set, or map.&lt;/p&gt;</description></item><item><title>Groups</title><link>https://crossplane-contrib.github.io/function-hcl/docs/language-guide/groups/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://crossplane-contrib.github.io/function-hcl/docs/language-guide/groups/</guid><description>&lt;p&gt;The &lt;code&gt;group&lt;/code&gt; block allows you to group related resources together and share local variables among them
without polluting the top-level namespace.&lt;/p&gt;
&lt;h2 id="syntax"&gt;Syntax&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-hcl" data-lang="hcl"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;group&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt; condition&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="err"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;bool&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;&lt;/span&gt;&lt;span class="c1"&gt; # optional: skip the entire group
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;locals&lt;/span&gt; { &lt;span class="p"&gt;...&lt;/span&gt; }&lt;span class="c1"&gt; # optional: shared locals for resources in this group
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;resource&lt;/span&gt; &lt;span class="err"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;name&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;&lt;/span&gt; { }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;resource&lt;/span&gt; &lt;span class="err"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;name&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;&lt;/span&gt; { }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;resources&lt;/span&gt; &lt;span class="err"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;name&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;&lt;/span&gt; { }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="example"&gt;Example&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-hcl" data-lang="hcl"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;group&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;locals&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt; vpcParams&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;composite&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;spec&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;parameters&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;vpc&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt; region&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;vpcParams&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;region&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;resource&lt;/span&gt; &lt;span class="k"&gt;my&lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="k"&gt;vpc&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt; body&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt; apiVersion&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ec2.aws.upbound.io/v1beta1&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt; kind&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;VPC&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt; metadata&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt; { name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;${req.composite.metadata.name}-vpc&amp;#34;&lt;/span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt; spec&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt; { forProvider&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt; { region&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt; region, cidrBlock&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;vpcParams&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;cidr&lt;/span&gt; } }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;resource&lt;/span&gt; &lt;span class="k"&gt;my&lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="k"&gt;subnet&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt; body&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt; apiVersion&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ec2.aws.upbound.io/v1beta1&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt; kind&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Subnet&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt; metadata&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt; { name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;${req.composite.metadata.name}-subnet&amp;#34;&lt;/span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt; spec&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt; forProvider&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt; region&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;region&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt; vpcId&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;resource&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;my&lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="k"&gt;vpc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;status&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;atProvider&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;id&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt; cidrBlock&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;vpcParams&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;subnetCidr&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;}&lt;span class="c1"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# vpcParams and region are NOT available here
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="scoping"&gt;Scoping&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Locals defined in a &lt;code&gt;group&lt;/code&gt; block are available to all resources within the group.&lt;/li&gt;
&lt;li&gt;They are &lt;strong&gt;not&lt;/strong&gt; available outside the group.&lt;/li&gt;
&lt;li&gt;Resources in the group still have access to top-level locals.&lt;/li&gt;
&lt;li&gt;Groups can contain &lt;code&gt;resource&lt;/code&gt;, &lt;code&gt;resources&lt;/code&gt;, and nested &lt;code&gt;group&lt;/code&gt; blocks.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="conditional-groups"&gt;Conditional Groups&lt;/h2&gt;
&lt;p&gt;A &lt;code&gt;group&lt;/code&gt; can have a &lt;code&gt;condition&lt;/code&gt; attribute to skip the entire group:&lt;/p&gt;</description></item><item><title>Conditions</title><link>https://crossplane-contrib.github.io/function-hcl/docs/language-guide/conditions/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://crossplane-contrib.github.io/function-hcl/docs/language-guide/conditions/</guid><description>&lt;p&gt;Use a &lt;code&gt;condition&lt;/code&gt; attribute to create resources only when specific conditions are met.
This is the function-hcl equivalent of Terraform&amp;rsquo;s &lt;code&gt;count = var.create ? 1 : 0&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="on-a-resource"&gt;On a Resource&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-hcl" data-lang="hcl"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;resource&lt;/span&gt; &lt;span class="k"&gt;s3_acl&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt; condition&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;composite&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;spec&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;parameters&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;createAcls&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;true&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt; body&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; {&lt;span class="c1"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt; # ...
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The &lt;code&gt;condition&lt;/code&gt; expression must evaluate to a boolean value. If the value is &lt;code&gt;false&lt;/code&gt;, the resource
is skipped entirely.&lt;/p&gt;
&lt;h2 id="on-a-resource-collection"&gt;On a Resource Collection&lt;/h2&gt;
&lt;p&gt;When applied to a &lt;code&gt;resources&lt;/code&gt; block, the condition controls the &lt;strong&gt;entire collection&lt;/strong&gt;. To filter
individual elements, filter the collection that &lt;code&gt;for_each&lt;/code&gt; iterates over instead.&lt;/p&gt;</description></item><item><title>Composite Status</title><link>https://crossplane-contrib.github.io/function-hcl/docs/language-guide/composite-status/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://crossplane-contrib.github.io/function-hcl/docs/language-guide/composite-status/</guid><description>&lt;p&gt;The &lt;code&gt;composite status&lt;/code&gt; block writes values to the composite resource&amp;rsquo;s (XR) status. It can be
specified any number of times, and each block can update specific fields.&lt;/p&gt;
&lt;h2 id="at-the-top-level"&gt;At the Top Level&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-hcl" data-lang="hcl"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;composite&lt;/span&gt; &lt;span class="k"&gt;status&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt; body&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt; foobarId&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;resource&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;foobar&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;status&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;atProvider&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;id&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="inside-a-resource-block"&gt;Inside a Resource Block&lt;/h2&gt;
&lt;p&gt;This is the more common pattern, since &lt;code&gt;self.resource&lt;/code&gt; gives you direct access to the observed
state of the current resource:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-hcl" data-lang="hcl"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;resource&lt;/span&gt; &lt;span class="k"&gt;foobar&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt; body&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; { &lt;span class="p"&gt;...&lt;/span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;composite&lt;/span&gt; &lt;span class="k"&gt;status&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt; body&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt; foobarId&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;resource&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;status&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;atProvider&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;id&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="merging-multiple-status-blocks"&gt;Merging Multiple Status Blocks&lt;/h2&gt;
&lt;p&gt;Multiple &lt;code&gt;composite status&lt;/code&gt; blocks can update different fields. Objects are merged:&lt;/p&gt;</description></item><item><title>Composite Connection Details</title><link>https://crossplane-contrib.github.io/function-hcl/docs/language-guide/composite-connection/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://crossplane-contrib.github.io/function-hcl/docs/language-guide/composite-connection/</guid><description>&lt;p&gt;The &lt;code&gt;composite connection&lt;/code&gt; block writes connection details to the composite resource.
It works the same way as &lt;code&gt;composite status&lt;/code&gt; in terms of scoping and merging.&lt;/p&gt;
&lt;h2 id="syntax"&gt;Syntax&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-hcl" data-lang="hcl"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;composite&lt;/span&gt; &lt;span class="k"&gt;connection&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt; body&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt; &amp;lt;key&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="err"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;base64&lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="k"&gt;encoded&lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="k"&gt;string&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;All values &lt;strong&gt;must&lt;/strong&gt; be strings that are base64 encoded. The function returns an error otherwise.&lt;/p&gt;
&lt;h2 id="at-the-top-level"&gt;At the Top Level&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-hcl" data-lang="hcl"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;composite&lt;/span&gt; &lt;span class="k"&gt;connection&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt; body&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt; url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;base64encode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;resource&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;foobar&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;status&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;atProvider&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;url&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="inside-a-resource-block"&gt;Inside a Resource Block&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-hcl" data-lang="hcl"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;resource&lt;/span&gt; &lt;span class="k"&gt;my&lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="k"&gt;database&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt; body&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; { &lt;span class="p"&gt;...&lt;/span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;composite&lt;/span&gt; &lt;span class="k"&gt;connection&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt; body&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt; connectionString&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;base64encode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;resource&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;status&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;atProvider&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;connectionString&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt; password&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;connection&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;password&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="c1"&gt; # already base64 from the provider
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="merging-and-conflict-detection"&gt;Merging and Conflict Detection&lt;/h2&gt;
&lt;p&gt;Multiple &lt;code&gt;composite connection&lt;/code&gt; blocks can set different keys. Two blocks cannot set the
same key to different values &amp;ndash; this is an error.&lt;/p&gt;</description></item><item><title>Resource Ready Status</title><link>https://crossplane-contrib.github.io/function-hcl/docs/language-guide/ready-status/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://crossplane-contrib.github.io/function-hcl/docs/language-guide/ready-status/</guid><description>&lt;p&gt;The &lt;code&gt;ready&lt;/code&gt; block lets you assign a ready state for a resource.
Usually you would use &lt;a href="https://github.com/crossplane-contrib/function-auto-ready"&gt;function-auto-ready&lt;/a&gt;
to automatically set the resource status.&lt;/p&gt;
&lt;p&gt;This allows you to set the ready status explicitly.&lt;/p&gt;
&lt;h2 id="syntax"&gt;Syntax&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-hcl" data-lang="hcl"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;resource&lt;/span&gt; &lt;span class="k"&gt;foo&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt; body&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; {&lt;span class="cm"&gt; /* ... */&lt;/span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;ready&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt; value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;READY_TRUE&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="valid-values"&gt;Valid Values&lt;/h2&gt;
&lt;p&gt;The &lt;code&gt;value&lt;/code&gt; attribute must evaluate to a string and be one of:&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Value&lt;/th&gt;
 &lt;th&gt;Meaning&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;&amp;quot;READY_UNSPECIFIED&amp;quot;&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Ready state is not known&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;&amp;quot;READY_TRUE&amp;quot;&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Resource is ready&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;&amp;quot;READY_FALSE&amp;quot;&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Resource is not ready&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="example-custom-readiness-check"&gt;Example: Custom Readiness Check&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-hcl" data-lang="hcl"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;resource&lt;/span&gt; &lt;span class="k"&gt;my&lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="k"&gt;database&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt; body&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; {&lt;span class="cm"&gt; /* ... */&lt;/span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;ready&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt; value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt; self.resource.status.atProvider.state&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;available&amp;#34; ? &amp;#34;READY_TRUE&amp;#34; : &amp;#34;READY_FALSE&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;If &lt;code&gt;self.resource&lt;/code&gt; is incomplete (resource not yet created), the &lt;code&gt;ready&lt;/code&gt; block follows
the same deferral rules as other blocks.&lt;/p&gt;</description></item><item><title>Context</title><link>https://crossplane-contrib.github.io/function-hcl/docs/language-guide/context/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://crossplane-contrib.github.io/function-hcl/docs/language-guide/context/</guid><description>&lt;p&gt;The &lt;code&gt;context&lt;/code&gt; block writes values into the Crossplane pipeline context, making them available
to downstream functions in the pipeline.&lt;/p&gt;
&lt;h2 id="syntax"&gt;Syntax&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-hcl" data-lang="hcl"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;context&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt; key&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="err"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;string&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt; value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="err"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;any&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="example"&gt;Example&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-hcl" data-lang="hcl"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;context&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt; key&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;example.com/foo-bar-baz&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt; value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt; foo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt; { bar&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;baz&amp;#34;&lt;/span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt; bar&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="m"&gt;10&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt; baz&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;quux&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="merging-multiple-context-blocks"&gt;Merging Multiple Context Blocks&lt;/h2&gt;
&lt;p&gt;You can write to the same context key from multiple blocks. Object values are merged using
the same rules as &lt;code&gt;composite status&lt;/code&gt;:&lt;/p&gt;</description></item><item><title>Requirements (Extra Resources)</title><link>https://crossplane-contrib.github.io/function-hcl/docs/language-guide/requirements/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://crossplane-contrib.github.io/function-hcl/docs/language-guide/requirements/</guid><description>&lt;p&gt;The &lt;code&gt;requirement&lt;/code&gt; block lets you request extra resources from Crossplane. These are typically
used to read configuration data (like &lt;code&gt;EnvironmentConfig&lt;/code&gt; objects) that aren&amp;rsquo;t part of the
composition&amp;rsquo;s resource tree.&lt;/p&gt;
&lt;h2 id="syntax"&gt;Syntax&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-hcl" data-lang="hcl"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;requirement&lt;/span&gt; &lt;span class="err"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;name&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt; condition&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="err"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;bool&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;&lt;/span&gt;&lt;span class="c1"&gt; # optional
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;locals&lt;/span&gt; { &lt;span class="p"&gt;...&lt;/span&gt; }&lt;span class="c1"&gt; # optional
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;select&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt; apiVersion&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="err"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;string&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt; kind&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="err"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;string&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt; matchName&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="err"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;string&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;&lt;/span&gt;&lt;span class="c1"&gt; # match by name
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt; # OR
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt; matchLabels&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="err"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;&lt;/span&gt;&lt;span class="c1"&gt; # match by labels
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;You must specify either &lt;code&gt;matchName&lt;/code&gt; or &lt;code&gt;matchLabels&lt;/code&gt;, but not both.&lt;/p&gt;</description></item><item><title>User-Defined Functions</title><link>https://crossplane-contrib.github.io/function-hcl/docs/language-guide/user-functions/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://crossplane-contrib.github.io/function-hcl/docs/language-guide/user-functions/</guid><description>&lt;p&gt;function-hcl lets you define reusable functions in your HCL code.&lt;/p&gt;
&lt;h2 id="defining-functions"&gt;Defining Functions&lt;/h2&gt;
&lt;p&gt;Functions are defined with the &lt;code&gt;function&lt;/code&gt; block. They &lt;strong&gt;must&lt;/strong&gt; be defined at the top level
(not inside a &lt;code&gt;group&lt;/code&gt; or other block).&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-hcl" data-lang="hcl"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="k"&gt;addNumbers&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;arg&lt;/span&gt; &lt;span class="k"&gt;a&lt;/span&gt; {}
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt; arg b { default&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;locals&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt; output&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;a&lt;/span&gt; &lt;span class="err"&gt;+&lt;/span&gt; &lt;span class="k"&gt;b&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt; body&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;output&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="structure"&gt;Structure&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;arg&lt;/code&gt; blocks&lt;/strong&gt; define the function&amp;rsquo;s parameters. Each arg can have an optional &lt;code&gt;default&lt;/code&gt; value
and an optional &lt;code&gt;description&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;locals&lt;/code&gt; blocks&lt;/strong&gt; can be used for temporary calculations.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;body&lt;/code&gt;&lt;/strong&gt; is the return value of the function.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="scoping-rules"&gt;Scoping Rules&lt;/h3&gt;
&lt;p&gt;Functions do &lt;strong&gt;not&lt;/strong&gt; have access to external state. You cannot use &lt;code&gt;req.composite&lt;/code&gt;, &lt;code&gt;self&lt;/code&gt;, or
any other variable from the calling context inside a function. Only the declared arguments and
locals within the function are accessible.&lt;/p&gt;</description></item></channel></rss>