<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: ​Andrzej Ressel</title>
    <description>The latest articles on DEV Community by ​Andrzej Ressel (@andrzejressel).</description>
    <link>https://dev.to/andrzejressel</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1935305%2F8893efff-e677-4226-9684-91b020d74a71.jpeg</url>
      <title>DEV Community: ​Andrzej Ressel</title>
      <link>https://dev.to/andrzejressel</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/andrzejressel"/>
    <language>en</language>
    <item>
      <title>Pulumi Gestalt 0.0.3 released</title>
      <dc:creator>​Andrzej Ressel</dc:creator>
      <pubDate>Tue, 17 Jun 2025 00:00:00 +0000</pubDate>
      <link>https://dev.to/andrzejressel/pulumi-gestalt-003-released-4a3h</link>
      <guid>https://dev.to/andrzejressel/pulumi-gestalt-003-released-4a3h</guid>
      <description>&lt;p&gt;This is the third release of &lt;a href="https://github.com/andrzejressel/pulumi-gestalt" rel="noopener noreferrer"&gt;Pulumi Gestalt&lt;/a&gt;, a universal runtime for Pulumi.&lt;/p&gt;

&lt;h2&gt;
  
  
  Schema
&lt;/h2&gt;

&lt;p&gt;Pulumi schemas have traditionally been stored in YAML files, but the complexity of their content often leads to a lot of boilerplate when mapping into domain objects. In Pulumi Gestalt 0.0.3, both the Rust and C FFI targets (Wasm coming later) now support obtaining schemas as native Rust structs or serialized Protobuf messages for C.&lt;/p&gt;

&lt;p&gt;The Protobuf schema is designed to be straightforward—no additional mapping logic required. Check documentation for more info:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://pulumi-gestalt.readthedocs.io/v0.0.3/integrations/overview/#get-schema" rel="noopener noreferrer"&gt;https://pulumi-gestalt.readthedocs.io/v0.0.3/integrations/overview/#get-schema&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://pulumi-gestalt.readthedocs.io/v0.0.3/integrations/schema/" rel="noopener noreferrer"&gt;https://pulumi-gestalt.readthedocs.io/v0.0.3/integrations/schema/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Give Pulumi Gestalt 0.0.3 a try and let me know what you think!&lt;/p&gt;

</description>
      <category>devops</category>
      <category>rust</category>
      <category>opensource</category>
      <category>pulumi</category>
    </item>
    <item>
      <title>Pulumi Gestalt 0.0.2 released</title>
      <dc:creator>​Andrzej Ressel</dc:creator>
      <pubDate>Sun, 06 Apr 2025 04:00:00 +0000</pubDate>
      <link>https://dev.to/andrzejressel/pulumi-gestalt-002-released-5hm8</link>
      <guid>https://dev.to/andrzejressel/pulumi-gestalt-002-released-5hm8</guid>
      <description>&lt;p&gt;This is the second release of &lt;a href="https://github.com/andrzejressel/pulumi-gestalt" rel="noopener noreferrer"&gt;Pulumi Gestalt&lt;/a&gt;, a universal runtime for Pulumi.&lt;/p&gt;

&lt;h2&gt;
  
  
  Wasm Cleanup
&lt;/h2&gt;

&lt;p&gt;I've cleaned up the Wasm WIT files quite a bit. Before, there were two files and four worlds—now, it's down to a single file and a single world.&lt;/p&gt;

&lt;h2&gt;
  
  
  Config API
&lt;/h2&gt;

&lt;p&gt;This version introduces a new &lt;code&gt;get_config&lt;/code&gt; function, which lets users retrieve &lt;a href="https://www.pulumi.com/docs/iac/concepts/config/" rel="noopener noreferrer"&gt;configuration values&lt;/a&gt;. It works with both plaintext values and secrets.&lt;/p&gt;

&lt;h2&gt;
  
  
  Documentation Improvements
&lt;/h2&gt;

&lt;p&gt;I also made some updates to the documentation. There's now a new Rust example aimed at language implementers who want to use Rust, and I rewrote the old C++ example in pure C.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's Next?
&lt;/h2&gt;

&lt;p&gt;For the next version, I'm hoping to add a Schema API to make code generation easier. &lt;/p&gt;

&lt;p&gt;Give Pulumi Gestalt 0.0.2 a try and let me know what you think!&lt;/p&gt;

</description>
      <category>devops</category>
      <category>rust</category>
      <category>opensource</category>
      <category>pulumi</category>
    </item>
    <item>
      <title>Pulumi Gestalt 0.0.1 released</title>
      <dc:creator>​Andrzej Ressel</dc:creator>
      <pubDate>Mon, 10 Mar 2025 10:00:00 +0000</pubDate>
      <link>https://dev.to/andrzejressel/pulumi-gestalt-001-released-4i8m</link>
      <guid>https://dev.to/andrzejressel/pulumi-gestalt-001-released-4i8m</guid>
      <description>&lt;p&gt;After &lt;a href="https://github.com/andrzejressel/pulumi-gestalt/commit/b4cf851569e64a4da75ccd23c92f57b0cca7055e" rel="noopener noreferrer"&gt;a year of work&lt;/a&gt; and &lt;a href="https://dev.to/andrzejressel/series/30425"&gt;multiple DevLogs&lt;/a&gt;, the first public release of &lt;a href="https://github.com/andrzejressel/pulumi-gestalt" rel="noopener noreferrer"&gt;Pulumi Gestalt&lt;/a&gt; is now available!&lt;/p&gt;

&lt;h2&gt;
  
  
  What is Pulumi Gestalt?
&lt;/h2&gt;

&lt;p&gt;Historically, adding a new language to Pulumi has been a significant challenge—requiring integration with the gRPC API, proper serialization, schema.json processing, and creating callback infrastructure.&lt;/p&gt;

&lt;p&gt;Pulumi Gestalt aims to change that. Currently it provides a set of &lt;a href="https://pulumi-gestalt.readthedocs.io/latest/integrations/overview/" rel="noopener noreferrer"&gt;ten functions&lt;/a&gt; that allow developers to add basic Pulumi support for any language that supports:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;C FFI&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rust&lt;/strong&gt; (for languages such as &lt;a href="https://github.com/rusterlium/rustler" rel="noopener noreferrer"&gt;Erlang&lt;/a&gt; or &lt;a href="https://github.com/fzyzcjy/flutter_rust_bridge" rel="noopener noreferrer"&gt;Dart&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Wasm&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Currently, Pulumi Gestalt allows:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Resource creation and invocation&lt;/li&gt;
&lt;li&gt;Output mapping&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Rust Support
&lt;/h2&gt;

&lt;p&gt;Beyond general language integration, Pulumi Gestalt includes &lt;strong&gt;comprehensive support for Rust&lt;/strong&gt;. Key features include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Automatic glue code generation&lt;/strong&gt; on the user side&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Filtering support&lt;/strong&gt; for large providers (e.g., cloud providers that require 20GB+ RAM for compilation without filters)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Example code generation&lt;/strong&gt; (currently in early alpha)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What’s Next?
&lt;/h2&gt;

&lt;p&gt;Pulumi Gestalt is just getting started. Upcoming features include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A &lt;strong&gt;schema.json converter&lt;/strong&gt; for easier ingestion (likely supporting &lt;a href="https://avro.apache.org/" rel="noopener noreferrer"&gt;Avro&lt;/a&gt; and &lt;a href="https://protobuf.dev/" rel="noopener noreferrer"&gt;Protobuf&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.pulumi.com/docs/iac/concepts/config/" rel="noopener noreferrer"&gt;&lt;strong&gt;Configuration support&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.pulumi.com/automation/" rel="noopener noreferrer"&gt;&lt;strong&gt;Automation API integration&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This initial release provides a strong foundation for expanding Pulumi support across more languages.&lt;/p&gt;

&lt;h2&gt;
  
  
  Documentation &amp;amp; Examples
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Full documentation:&lt;/strong&gt; &lt;a href="https://pulumi-gestalt.readthedocs.io/latest/" rel="noopener noreferrer"&gt;Pulumi Gestalt Docs&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rust examples:&lt;/strong&gt; &lt;a href="https://github.com/andrzejressel/pulumi-gestalt-example" rel="noopener noreferrer"&gt;GitHub Repository&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>devops</category>
      <category>rust</category>
      <category>opensource</category>
      <category>pulumi</category>
    </item>
    <item>
      <title>Pulumi Gestalt devlog #8</title>
      <dc:creator>​Andrzej Ressel</dc:creator>
      <pubDate>Sun, 16 Feb 2025 19:30:16 +0000</pubDate>
      <link>https://dev.to/andrzejressel/pulumi-gestalt-devlog-8-1d1m</link>
      <guid>https://dev.to/andrzejressel/pulumi-gestalt-devlog-8-1d1m</guid>
      <description>&lt;p&gt;Welcome to the eighth devlog for &lt;strong&gt;Pulumi Gestalt&lt;/strong&gt;. This week, the focus was on preparing native Rust support and moving toward an initial release.&lt;/p&gt;

&lt;h2&gt;
  
  
  Native Rust Support
&lt;/h2&gt;

&lt;p&gt;Previously, Rust support in Pulumi Gestalt was essentially Wasm/Rust support, which required a complex setup and runtime environment. This week, I implemented proper native Rust support, which simplifies the process significantly. Now you can get started without external runners - only &lt;code&gt;Rust&lt;/code&gt; and &lt;a href="https://github.com/casey/just" rel="noopener noreferrer"&gt;&lt;code&gt;Just&lt;/code&gt;&lt;/a&gt; required.&lt;/p&gt;

&lt;h2&gt;
  
  
  Initial Release
&lt;/h2&gt;

&lt;p&gt;After several weeks of development and refinement, I believe Pulumi Gestalt has reached a state where it’s ready for an initial release. Over the next few days, I’ll be focusing on finalizing documentation and ensuring consistent naming conventions across the SDKs to provide a smoother experience for users.&lt;/p&gt;




&lt;p&gt;That’s all for this week’s updates! As always, I welcome your feedback. If you have any thoughts, suggestions, or run into issues, feel free to share them on either the &lt;a href="https://github.com/andrzejressel/pulumi-gestalt" rel="noopener noreferrer"&gt;main repository&lt;/a&gt; or the &lt;a href="https://github.com/andrzejressel/pulumi-gestalt-example" rel="noopener noreferrer"&gt;example repository&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>devops</category>
      <category>rust</category>
      <category>opensource</category>
      <category>pulumi</category>
    </item>
    <item>
      <title>Pulumi W̶a̶s̶m̶/̶R̶u̶s̶t̶ Gestalt devlog #7</title>
      <dc:creator>​Andrzej Ressel</dc:creator>
      <pubDate>Sun, 09 Feb 2025 18:27:01 +0000</pubDate>
      <link>https://dev.to/andrzejressel/pulumi-wasmrust-gestalt-devlog-7-1f6o</link>
      <guid>https://dev.to/andrzejressel/pulumi-wasmrust-gestalt-devlog-7-1f6o</guid>
      <description>&lt;p&gt;Welcome to the seventh devlog for Pulumi &lt;del&gt;Wasm/Rust&lt;/del&gt; Gestalt. This week was all about rerelease and preparation for native Rust support.&lt;/p&gt;

&lt;h2&gt;
  
  
  Rerelease
&lt;/h2&gt;

&lt;p&gt;The project has been renamed to &lt;strong&gt;Pulumi Gestalt&lt;/strong&gt;. The new name reflects the broader vision of the project—to provide simple interfaces for other programming languages to add support for Pulumi. While not all documentation pages have been updated yet, the GitHub and Cloudsmith repositories have been renamed:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Main repository: &lt;a href="https://github.com/andrzejressel/pulumi-gestalt" rel="noopener noreferrer"&gt;https://github.com/andrzejressel/pulumi-gestalt&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Examples repository: &lt;a href="https://github.com/andrzejressel/pulumi-gestalt-example" rel="noopener noreferrer"&gt;https://github.com/andrzejressel/pulumi-gestalt-example&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Releases repository: &lt;a href="https://github.com/andrzejressel/pulumi-gestalt-releases" rel="noopener noreferrer"&gt;https://github.com/andrzejressel/pulumi-gestalt-releases&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Docs: &lt;a href="https://andrzejressel.github.io/pulumi-gestalt/" rel="noopener noreferrer"&gt;https://andrzejressel.github.io/pulumi-gestalt/&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Native Rust support
&lt;/h2&gt;

&lt;p&gt;Currently, Pulumi Gestalt supports C and Wasm/Rust. Next week, I'll be working on &lt;strong&gt;native Rust support&lt;/strong&gt;, which will also pave the way for other languages like &lt;a href="https://github.com/fzyzcjy/flutter_rust_bridge" rel="noopener noreferrer"&gt;Dart&lt;/a&gt; and &lt;a href="https://github.com/rusterlium/rustler" rel="noopener noreferrer"&gt;Erlang&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;That’s all for this week’s updates! As always, feedback is welcome — let me know your thoughts or if you run into any issues on either &lt;a href="https://github.com/andrzejressel/pulumi-gestalt" rel="noopener noreferrer"&gt;main repository&lt;/a&gt; or &lt;a href="https://github.com/andrzejressel/pulumi-gestalt-example" rel="noopener noreferrer"&gt;example repository&lt;/a&gt;&lt;/p&gt;

</description>
      <category>devops</category>
      <category>rust</category>
      <category>opensource</category>
      <category>pulumi</category>
    </item>
    <item>
      <title>Pulumi Wasm/Rust devlog #6</title>
      <dc:creator>​Andrzej Ressel</dc:creator>
      <pubDate>Sat, 01 Feb 2025 18:23:27 +0000</pubDate>
      <link>https://dev.to/andrzejressel/pulumi-wasmrust-devlog-6-o1b</link>
      <guid>https://dev.to/andrzejressel/pulumi-wasmrust-devlog-6-o1b</guid>
      <description>&lt;p&gt;Welcome to the sixth devlog for the Wasm/Rust support for Pulumi! This week and the next are all about the project's rerelease under a new name and C FFI support. Let’s dive into the updates!&lt;/p&gt;

&lt;h2&gt;
  
  
  C FFI Support
&lt;/h2&gt;

&lt;p&gt;I’m excited to share that the project is being extended to support &lt;strong&gt;C FFI (Foreign Function Interface)&lt;/strong&gt;! This opens up new possibilities for integrating additional languages into the Pulumi ecosystem. While the C FFI support is still in its early stages and not fully documented, I encourage all experimenters to give it a try and share your feedback.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Prebuilt Library&lt;/strong&gt;: You can find the prebuilt library in the &lt;a href="https://github.com/andrzejressel/pulumi-wasm-releases/releases" rel="noopener noreferrer"&gt;releases section&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Example C++ Project&lt;/strong&gt;: To help you get started, I’ve added an example C++ project in the &lt;a href="https://github.com/andrzejressel/pulumi-wasm/tree/main/examples/cpp" rel="noopener noreferrer"&gt;main repository&lt;/a&gt;. This should serve as a useful reference for integrating the library with other languages.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;That’s all for this week’s updates! As always, feedback is welcome — let me know your thoughts or if you run into any issues on either &lt;a href="https://github.com/andrzejressel/pulumi-wasm" rel="noopener noreferrer"&gt;main repository&lt;/a&gt; or &lt;a href="https://github.com/andrzejressel/pulumi-wasm-example" rel="noopener noreferrer"&gt;example repository&lt;/a&gt;&lt;/p&gt;

</description>
      <category>devops</category>
      <category>rust</category>
      <category>opensource</category>
      <category>pulumi</category>
    </item>
    <item>
      <title>Pulumi Wasm/Rust devlog #5</title>
      <dc:creator>​Andrzej Ressel</dc:creator>
      <pubDate>Sun, 26 Jan 2025 18:14:50 +0000</pubDate>
      <link>https://dev.to/andrzejressel/pulumi-wasmrust-devlog-5-1cib</link>
      <guid>https://dev.to/andrzejressel/pulumi-wasmrust-devlog-5-1cib</guid>
      <description>&lt;p&gt;Welcome to the fifth devlog for the Wasm/Rust support for Pulumi! This week, I focused on three key areas: project renaming, implementing support for secrets, and introducing a context parameter as preparation for C FFI integration.  &lt;/p&gt;

&lt;h2&gt;
  
  
  Project Renaming
&lt;/h2&gt;

&lt;p&gt;The project has been renamed from &lt;strong&gt;Pulumi WASM&lt;/strong&gt; to &lt;strong&gt;Pulumi Wasm&lt;/strong&gt;. This change is mostly cosmetic and limited to documentation updates—there were no changes to the actual codebase.  &lt;/p&gt;

&lt;h2&gt;
  
  
  Secrets
&lt;/h2&gt;

&lt;p&gt;Pulumi Wasm now supports &lt;a href="https://www.pulumi.com/docs/iac/concepts/secrets/" rel="noopener noreferrer"&gt;secrets&lt;/a&gt;! 🎉 This brings new functionality to the project:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A new &lt;code&gt;Output&lt;/code&gt; constructor, &lt;a href="https://andrzejressel.github.io/pulumi-wasm/rust-docs/pulumi_wasm_rust/struct.Output.html#method.new_secret" rel="noopener noreferrer"&gt;&lt;code&gt;Output::new_secret&lt;/code&gt;&lt;/a&gt;, has been added to handle secrets.
&lt;/li&gt;
&lt;li&gt;Resources that return secrets (like those in the &lt;code&gt;random&lt;/code&gt; provider) are now correctly processed.
&lt;/li&gt;
&lt;li&gt;Mapping and combining functions have also been updated to respect secrets:

&lt;ul&gt;
&lt;li&gt;A mapped secret &lt;code&gt;Output&lt;/code&gt; remains secret.
&lt;/li&gt;
&lt;li&gt;When combining outputs, if any of the inputs are secret, the resulting output is also marked as secret.
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h2&gt;
  
  
  Context Parameter
&lt;/h2&gt;

&lt;p&gt;To prepare for future C FFI integration, the implicit global Pulumi value has been removed. Instead, most functions now require a &lt;code&gt;PulumiContext&lt;/code&gt; object. This change affects several core areas of the library, including:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;Output&lt;/code&gt; constructors
&lt;/li&gt;
&lt;li&gt;Formatting
&lt;/li&gt;
&lt;li&gt;Resource creation
&lt;/li&gt;
&lt;li&gt;Function invocation
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Additionally, the &lt;code&gt;pulumi_main&lt;/code&gt; macro has been reworked. Previously, it was a procedural macro applied directly to the &lt;code&gt;main&lt;/code&gt; function:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nn"&gt;anyhow&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nb"&gt;Result&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  
&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nn"&gt;pulumi_wasm_rust&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;pulumi_main&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  

&lt;span class="nd"&gt;#[pulumi_main]&lt;/span&gt;  
&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;Result&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;  
&lt;span class="p"&gt;}&lt;/span&gt;  
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, it is a declarative macro that expects a &lt;code&gt;pulumi_main(PulumiContext)&lt;/code&gt; function defined at the same level:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nn"&gt;anyhow&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nb"&gt;Result&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  
&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nn"&gt;pulumi_wasm_rust&lt;/span&gt;&lt;span class="p"&gt;::{&lt;/span&gt;&lt;span class="n"&gt;pulumi_main&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;PulumiContext&lt;/span&gt;&lt;span class="p"&gt;};&lt;/span&gt;  

&lt;span class="nd"&gt;pulumi_main!&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;  

&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;pulumi_main&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;PulumiContext&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;Result&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;  
&lt;span class="p"&gt;}&lt;/span&gt;  
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;That’s all for this week’s updates! As always, feedback is welcome — let me know your thoughts or if you run into any issues on either &lt;a href="https://github.com/andrzejressel/pulumi-wasm" rel="noopener noreferrer"&gt;main repository&lt;/a&gt; or &lt;a href="https://github.com/andrzejressel/pulumi-wasm-example" rel="noopener noreferrer"&gt;example repository&lt;/a&gt;&lt;/p&gt;

</description>
      <category>devops</category>
      <category>rust</category>
      <category>opensource</category>
      <category>pulumi</category>
    </item>
    <item>
      <title>Pulumi Wasm/Rust devlog #4</title>
      <dc:creator>​Andrzej Ressel</dc:creator>
      <pubDate>Sun, 19 Jan 2025 22:38:22 +0000</pubDate>
      <link>https://dev.to/andrzejressel/pulumi-wasmrust-devlog-4-3acd</link>
      <guid>https://dev.to/andrzejressel/pulumi-wasmrust-devlog-4-3acd</guid>
      <description>&lt;p&gt;Welcome to the fourth devlog for the Wasm/Rust support for Pulumi! This week, I focused on improving provider versioning and spent time exploring the long-term vision for the project. Here’s what’s new:&lt;/p&gt;

&lt;h2&gt;
  
  
  Provider Version Support
&lt;/h2&gt;

&lt;p&gt;Until now, we hadn’t set the proper provider version when calling Pulumi. While this didn’t throw an error, it caused the newest installed provider to be used by default. Since providers can introduce incompatible changes between versions, this behavior could lead to subtle bugs.  &lt;/p&gt;

&lt;p&gt;This issue has now been resolved. The provider glue code generated for version &lt;code&gt;X&lt;/code&gt; will now explicitly request version &lt;code&gt;X&lt;/code&gt; from Pulumi during execution, ensuring compatibility and reducing the risk of unexpected errors.&lt;/p&gt;

&lt;h2&gt;
  
  
  Future of the Project
&lt;/h2&gt;

&lt;p&gt;This week, I spent a lot of time reflecting on the future direction of this project. (In fact, I created &lt;a href="https://github.com/andrzejressel/pulumi-wasm/issues/692" rel="noopener noreferrer"&gt;a few tickets&lt;/a&gt; &lt;a href="https://github.com/andrzejressel/pulumi-wasm/issues/651" rel="noopener noreferrer"&gt;to explore this further&lt;/a&gt;).  &lt;/p&gt;

&lt;p&gt;While WASM is an exciting target and has allowed me to design a constrained Pulumi execution engine, I’m now considering expanding the scope to include a native library. My goal is to create something akin to &lt;a href="https://github.com/awslabs/aws-crt-java" rel="noopener noreferrer"&gt;Amazon’s CRT&lt;/a&gt;—a library that supports both languages with C FFI and WASM-only languages. This approach would allow the project to serve a broader range of use cases and developers.&lt;/p&gt;




&lt;p&gt;That's all for this week's updates!. As always, feedback is welcome—let me know your thoughts or if you run into any issues!&lt;/p&gt;

</description>
      <category>devops</category>
      <category>rust</category>
      <category>opensource</category>
      <category>pulumi</category>
    </item>
    <item>
      <title>Pulumi Wasm/Rust devlog #3</title>
      <dc:creator>​Andrzej Ressel</dc:creator>
      <pubDate>Mon, 13 Jan 2025 20:24:01 +0000</pubDate>
      <link>https://dev.to/andrzejressel/pulumi-wasmrust-devlog-3-4dc4</link>
      <guid>https://dev.to/andrzejressel/pulumi-wasmrust-devlog-3-4dc4</guid>
      <description>&lt;p&gt;Welcome to the third devlog for the Wasm/Rust support for Pulumi! This week, I focused on improving the versioning and release process, along with adding a new &lt;code&gt;format!&lt;/code&gt;-like macro. Here's what's new:&lt;/p&gt;

&lt;h2&gt;
  
  
  Versioning
&lt;/h2&gt;

&lt;p&gt;Previously, every version used the format &lt;code&gt;0.0.0-NIGHTLY-COMMITSHA&lt;/code&gt;. The main issue was that users did not know when a library version was released, making it difficult to check for updates.  &lt;/p&gt;

&lt;p&gt;To solve this, I've switched to &lt;a href="https://calver.org/" rel="noopener noreferrer"&gt;calver&lt;/a&gt;. For example, today's release would be &lt;code&gt;v25.1.12-47a9821&lt;/code&gt;.  &lt;/p&gt;

&lt;p&gt;This ensures users can quickly identify the release date of a version, making it easier to stay up to date.&lt;/p&gt;

&lt;h2&gt;
  
  
  Release Spam
&lt;/h2&gt;

&lt;p&gt;Pulumi and &lt;code&gt;binstall&lt;/code&gt; require a GitHub release for every deployed version. Currently, I deploy a new version after every commit to the &lt;code&gt;main&lt;/code&gt; branch, which creates notification spam for users who star the repository.  &lt;/p&gt;

&lt;p&gt;To resolve this, I've created a separate repository just for releases: &lt;a href="https://github.com/andrzejressel/pulumi-wasm-releases" rel="noopener noreferrer"&gt;&lt;code&gt;pulumi-wasm-releases&lt;/code&gt;&lt;/a&gt;. This keeps the main repository cleaner while ensuring users can still access the latest versions.&lt;/p&gt;

&lt;p&gt;Additionally, the commands for downloading binaries have changed due to the separate release repository. Be sure to check the &lt;a href="https://github.com/andrzejressel/pulumi-wasm-example" rel="noopener noreferrer"&gt;example repository&lt;/a&gt; for updated instructions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Format Macro
&lt;/h2&gt;

&lt;p&gt;The latest version of the library introduces the &lt;code&gt;pulumi_format!&lt;/code&gt; macro. It works like Rust's &lt;code&gt;format!&lt;/code&gt; macro but is designed specifically for Pulumi's &lt;code&gt;Output&lt;/code&gt; types.  &lt;/p&gt;

&lt;p&gt;A key feature is that not all arguments need to be of type &lt;code&gt;Output&lt;/code&gt;—you can seamlessly combine &lt;code&gt;Output&lt;/code&gt; values with regular values.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;Output&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;Output&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="s"&gt;"test"&lt;/span&gt;&lt;span class="nf"&gt;.to_string&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;formatted&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Output&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nd"&gt;pulumi_format!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"{} {}"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// "1 test"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Replacement of combineX function with pulumi_combine! macro
&lt;/h2&gt;

&lt;p&gt;Previously, there were multiple combineX methods for combining Outputs. These have now been replaced with a single pulumi_combine! macro for greater flexibility and simplicity. This change reduces redundancy and makes the API more intuitive.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;Output&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;Output&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="s"&gt;"test"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;combined&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Output&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;i32&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nd"&gt;pulumi_combine!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;That's all for this week's updates!. As always, feedback is welcome—let me know your thoughts or if you run into any issues!&lt;/p&gt;

</description>
      <category>devops</category>
      <category>rust</category>
      <category>opensource</category>
      <category>pulumi</category>
    </item>
    <item>
      <title>Pulumi Wasm/Rust devlog #2</title>
      <dc:creator>​Andrzej Ressel</dc:creator>
      <pubDate>Sun, 05 Jan 2025 17:44:26 +0000</pubDate>
      <link>https://dev.to/andrzejressel/pulumi-wasmrust-devlog-2-275i</link>
      <guid>https://dev.to/andrzejressel/pulumi-wasmrust-devlog-2-275i</guid>
      <description>&lt;p&gt;Welcome to the second devlog for the Wasm/Rust support for Pulumi! This week, I focused on key improvements related to module generation, cloud provider support, and CI optimization. Here's what's new:&lt;/p&gt;

&lt;h2&gt;
  
  
  Module filtering
&lt;/h2&gt;

&lt;p&gt;Compiling large cloud providers like AWS can be time-consuming and resource-intensive. For example, building the entire AWS provider can take over 10 minutes and use 10GB of RAM. This is often unnecessary since most users only need specific functionality.&lt;/p&gt;

&lt;p&gt;To address this, I’ve added &lt;strong&gt;module filtering&lt;/strong&gt; support. Now, you can use the new &lt;a href="https://andrzejressel.github.io/pulumi-wasm/rust-docs/pulumi_wasm_build/fn.generate_with_filter.html" rel="noopener noreferrer"&gt;&lt;code&gt;generate_with_filter&lt;/code&gt;&lt;/a&gt; function to generate only the modules you need.&lt;/p&gt;

&lt;h3&gt;
  
  
  Example Use Case
&lt;/h3&gt;

&lt;p&gt;If your project only uses AWS S3, you can specify just the &lt;code&gt;s3&lt;/code&gt; module to dramatically reduce compilation time and memory usage.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="nf"&gt;generate_with_filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"aws"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"6.66.2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;"s3"&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This feature saves time and reduces resource usage, and improves efficiency during development.&lt;/p&gt;

&lt;h2&gt;
  
  
  AWS/Azure/GCP Classic
&lt;/h2&gt;

&lt;p&gt;I’m excited to announce that the three largest cloud providers — AWS, Azure, and GCP — are now officially supported and tested. A subset of their APIs is available for preview in the documentation:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://andrzejressel.github.io/pulumi-wasm/rust-docs/pulumi_wasm_providers_aws_mini/index.html" rel="noopener noreferrer"&gt;AWS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://andrzejressel.github.io/pulumi-wasm/rust-docs/pulumi_wasm_providers_azure_mini/index.html" rel="noopener noreferrer"&gt;Azure&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://andrzejressel.github.io/pulumi-wasm/rust-docs/pulumi_wasm_providers_gcp_mini/index.html" rel="noopener noreferrer"&gt;GCP&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When using these providers, I recommend using the &lt;strong&gt;module filtering&lt;/strong&gt; mentioned earlier to customize your build to include only what you need.&lt;/p&gt;

&lt;h2&gt;
  
  
  CI
&lt;/h2&gt;

&lt;p&gt;To ensure stability and reliability, I’ve made significant improvements to the CI pipeline. Previously, all integration tests ran in a single CI job, which slowed feedback. Now, each provider is tested in its own dedicated job which reduces CI time significantly.&lt;/p&gt;




&lt;p&gt;Thank you for following along with this journey! If you’re interested in contributing or trying it out, check out the &lt;a href="https://github.com/andrzejressel/pulumi-wasm" rel="noopener noreferrer"&gt;main&lt;/a&gt; and &lt;a href="https://github.com/andrzejressel/pulumi-wasm-example" rel="noopener noreferrer"&gt;example&lt;/a&gt; repositories for more details. Your feedback is invaluable — feel free to open an issue or share your thoughts!&lt;/p&gt;

</description>
      <category>devops</category>
      <category>rust</category>
      <category>opensource</category>
      <category>pulumi</category>
    </item>
    <item>
      <title>Pulumi Wasm/Rust devlog #1</title>
      <dc:creator>​Andrzej Ressel</dc:creator>
      <pubDate>Sun, 29 Dec 2024 00:30:05 +0000</pubDate>
      <link>https://dev.to/andrzejressel/pulumi-wasmrust-devlog-1-25n1</link>
      <guid>https://dev.to/andrzejressel/pulumi-wasmrust-devlog-1-25n1</guid>
      <description>&lt;p&gt;Since &lt;a href="https://dev.to/andrzejressel/experimental-wasmrust-support-for-pulumi-igf"&gt;my last post&lt;/a&gt; more than half a year have passed. The project is still going strong and a lot of improvements have been introduced.&lt;/p&gt;

&lt;h2&gt;
  
  
  Builders
&lt;/h2&gt;

&lt;p&gt;Last time, all fields were required (even is they are empty):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;random_string_1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;random_string&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="s"&gt;"test_1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;RandomStringArgs&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;keepers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;None&lt;/span&gt;&lt;span class="nf"&gt;.into&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
            &lt;span class="n"&gt;length&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;lower&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;None&lt;/span&gt;&lt;span class="nf"&gt;.into&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
            &lt;span class="n"&gt;min_lower&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;None&lt;/span&gt;&lt;span class="nf"&gt;.into&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
            &lt;span class="n"&gt;min_numeric&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;None&lt;/span&gt;&lt;span class="nf"&gt;.into&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
            &lt;span class="n"&gt;min_special&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;None&lt;/span&gt;&lt;span class="nf"&gt;.into&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
            &lt;span class="n"&gt;min_upper&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;None&lt;/span&gt;&lt;span class="nf"&gt;.into&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
            &lt;span class="n"&gt;number&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;None&lt;/span&gt;&lt;span class="nf"&gt;.into&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
            &lt;span class="n"&gt;numeric&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;None&lt;/span&gt;&lt;span class="nf"&gt;.into&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
            &lt;span class="n"&gt;override_special&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;None&lt;/span&gt;&lt;span class="nf"&gt;.into&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
            &lt;span class="n"&gt;special&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;None&lt;/span&gt;&lt;span class="nf"&gt;.into&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
            &lt;span class="n"&gt;upper&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;None&lt;/span&gt;&lt;span class="nf"&gt;.into&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I've migrated all the structs to &lt;a href="https://github.com/elastio/bon/" rel="noopener noreferrer"&gt;bon&lt;/a&gt; so now they look like this&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;random_string_1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;random_string&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="s"&gt;"test_1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="nn"&gt;RandomStringArgs&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="nf"&gt;.length&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;length&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="nf"&gt;.build_struct&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
    &lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In the future I will experiment with &lt;a href="https://bon-rs.com/guide/overview#function-builder" rel="noopener noreferrer"&gt;Function Builder&lt;/a&gt; to see if it will be a better choice&lt;/p&gt;

&lt;h2&gt;
  
  
  Code generation
&lt;/h2&gt;

&lt;p&gt;Last time provider was split into two parts - Wasm based provider (generated on Pulumi WASM side and distributed as binary artifact) and glue code (potentially generated on user side, last time still generated by Pulumi Wasm).&lt;/p&gt;

&lt;p&gt;I've decided to go 100% for code generation on user side. Thanks to that user can use any provider they want in any version they want. In addition provider does not have to be available in public Pulumi registry - glue code can be generated from schema.json.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="cs"&gt;# build.rs&lt;/span&gt;
&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nn"&gt;std&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nn"&gt;error&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;Result&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="nb"&gt;Box&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;dyn&lt;/span&gt; &lt;span class="n"&gt;Error&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nn"&gt;pulumi_wasm_build&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;generate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"random"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"4.15.0"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nf"&gt;Ok&lt;/span&gt;&lt;span class="p"&gt;(())&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Examples
&lt;/h2&gt;

&lt;p&gt;Currently Pulumi does not export code examples in easy to ingest format. I've decided to try reading YAML and the results are pretty good - for now it's very basic and things like variables, interpolation and complicated order does not work. Here is example of &lt;a href="https://www.pulumi.com/registry/packages/aws/api-docs/acmpca/permission/" rel="noopener noreferrer"&gt;ACMPCA Permission&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nn"&gt;pulumi_wasm_rust&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Output&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nn"&gt;pulumi_wasm_rust&lt;/span&gt;&lt;span class="p"&gt;::{&lt;/span&gt;&lt;span class="n"&gt;add_export&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;pulumi_main&lt;/span&gt;&lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="nd"&gt;#[pulumi_main]&lt;/span&gt;
&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;test_main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;Result&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;Error&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;example&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;permission&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="s"&gt;"example"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="nn"&gt;PermissionArgs&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
            &lt;span class="nf"&gt;.actions&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nd"&gt;vec!&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;"IssueCertificate"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"GetCertificate"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"ListPermissions"&lt;/span&gt;&lt;span class="p"&gt;,])&lt;/span&gt;
            &lt;span class="nf"&gt;.certificate_authority_arn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"${exampleCertificateAuthority. arn}"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="nf"&gt;.principal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"acm.amazonaws.com"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="nf"&gt;.build_struct&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
    &lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;exampleCertificateAuthority&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;certificate_authority&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="s"&gt;"exampleCertificateAuthority"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="nn"&gt;CertificateAuthorityArgs&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
            &lt;span class="nf"&gt;.certificate_authority_configuration&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                &lt;span class="nn"&gt;CertificateAuthorityCertificateAuthorityConfiguration&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
                    &lt;span class="nf"&gt;.keyAlgorithm&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"RSA_4096"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                    &lt;span class="nf"&gt;.signingAlgorithm&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"SHA512WITHRSA"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                    &lt;span class="nf"&gt;.subject&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                        &lt;span class="nn"&gt;CertificateAuthorityCertificateAuthorityConfigurationSubject&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
                            &lt;span class="nf"&gt;.commonName&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"example. com"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                            &lt;span class="nf"&gt;.build_struct&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
                    &lt;span class="p"&gt;)&lt;/span&gt;
                    &lt;span class="nf"&gt;.build_struct&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
            &lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="nf"&gt;.build_struct&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
    &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;There are still a lot of things to do - generating the biggest providers (AWS almost works), core improvements (there are non-working edge cases, &lt;br&gt;
like functions without inputs), example generation improvements, documentation and creating PoC of non-rust WASM language.&lt;/p&gt;

&lt;p&gt;Links:&lt;br&gt;
Main repository: &lt;a href="https://github.com/andrzejressel/pulumi-wasm" rel="noopener noreferrer"&gt;https://github.com/andrzejressel/pulumi-wasm&lt;/a&gt;&lt;br&gt;
Example: &lt;a href="https://github.com/andrzejressel/pulumi-wasm-example" rel="noopener noreferrer"&gt;https://github.com/andrzejressel/pulumi-wasm-example&lt;/a&gt;&lt;/p&gt;

</description>
      <category>devops</category>
      <category>rust</category>
      <category>opensource</category>
      <category>pulumi</category>
    </item>
    <item>
      <title>Experimental Wasm/Rust support for Pulumi</title>
      <dc:creator>​Andrzej Ressel</dc:creator>
      <pubDate>Thu, 15 Aug 2024 21:55:25 +0000</pubDate>
      <link>https://dev.to/andrzejressel/experimental-wasmrust-support-for-pulumi-igf</link>
      <guid>https://dev.to/andrzejressel/experimental-wasmrust-support-for-pulumi-igf</guid>
      <description>&lt;p&gt;I was working on this for the last few months and while it's still not very ergonomic I believe it's usable enough to write post about it.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is Pulumi
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.pulumi.com/" rel="noopener noreferrer"&gt;Pulumi&lt;/a&gt; as basically Terraform, but you write code in your favourite programming language. Officially it supports Go, Python, Typescript, C# and Java (kinda). There is also community support for &lt;a href="https://github.com/VirtuslabRnD/pulumi-kotlin" rel="noopener noreferrer"&gt;Kotlin&lt;/a&gt; and &lt;a href="https://github.com/VirtusLab/besom" rel="noopener noreferrer"&gt;Scala&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Why WASM
&lt;/h2&gt;

&lt;p&gt;I'm mostly interested in interopability of Wasm and WASI's &lt;a href="https://component-model.bytecodealliance.org/" rel="noopener noreferrer"&gt;Component Model&lt;/a&gt;. Thanks to component model I can generate WASM module with core logic and others can develop bindings for it in their own language. While currently not many languages &lt;a href="https://github.com/bytecodealliance/wit-bindgen/tree/main/crates" rel="noopener noreferrer"&gt;support binding generation&lt;/a&gt;, I believe with growing popularity of WASM this will change.&lt;/p&gt;

&lt;h2&gt;
  
  
  Current state
&lt;/h2&gt;

&lt;p&gt;The project is still in pretty rough state. The basic basics works - creating resources, mapping elements (even unknown ones) and passing them works, but it's pretty much it. There are some manual steps that must be made before running the code, versioning is very strict and not much of the pulumi features are implemented (for now only creating resources - nothing more).&lt;/p&gt;

&lt;p&gt;I'm currently planning on focusing on UX first and on additional Pulumi features later.&lt;/p&gt;

&lt;h2&gt;
  
  
  Example code
&lt;/h2&gt;

&lt;p&gt;Here is program that will generate two random strings, where the length of the second one is based on the first one - it's mostly to illustrate that the most interesting thing about Pulumi (arbitrary code execution on generated values) works.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nn"&gt;anyhow&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nn"&gt;pulumi_wasm_random&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nn"&gt;resource&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nn"&gt;random_string&lt;/span&gt;&lt;span class="p"&gt;::{&lt;/span&gt;&lt;span class="n"&gt;random_string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;RandomStringArgs&lt;/span&gt;&lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nn"&gt;pulumi_wasm_rust&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Output&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nn"&gt;pulumi_wasm_rust&lt;/span&gt;&lt;span class="p"&gt;::{&lt;/span&gt;&lt;span class="n"&gt;add_export&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;pulumi_main&lt;/span&gt;&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="nd"&gt;#[pulumi_main]&lt;/span&gt;
&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;test_main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;Result&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;Error&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;length&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Output&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nb"&gt;i32&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;Output&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;random_string_1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;random_string&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="s"&gt;"test_1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;RandomStringArgs&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;keepers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;None&lt;/span&gt;&lt;span class="nf"&gt;.into&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
            &lt;span class="n"&gt;length&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;lower&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;None&lt;/span&gt;&lt;span class="nf"&gt;.into&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
            &lt;span class="n"&gt;min_lower&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;None&lt;/span&gt;&lt;span class="nf"&gt;.into&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
            &lt;span class="n"&gt;min_numeric&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;None&lt;/span&gt;&lt;span class="nf"&gt;.into&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
            &lt;span class="n"&gt;min_special&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;None&lt;/span&gt;&lt;span class="nf"&gt;.into&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
            &lt;span class="n"&gt;min_upper&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;None&lt;/span&gt;&lt;span class="nf"&gt;.into&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
            &lt;span class="n"&gt;number&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;None&lt;/span&gt;&lt;span class="nf"&gt;.into&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
            &lt;span class="n"&gt;numeric&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;None&lt;/span&gt;&lt;span class="nf"&gt;.into&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
            &lt;span class="n"&gt;override_special&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;None&lt;/span&gt;&lt;span class="nf"&gt;.into&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
            &lt;span class="n"&gt;special&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;None&lt;/span&gt;&lt;span class="nf"&gt;.into&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
            &lt;span class="n"&gt;upper&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;None&lt;/span&gt;&lt;span class="nf"&gt;.into&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;new_length&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;random_string_1&lt;/span&gt;&lt;span class="py"&gt;.result&lt;/span&gt;&lt;span class="nf"&gt;.map&lt;/span&gt;&lt;span class="p"&gt;(|&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="nf"&gt;.len&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nb"&gt;i32&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;random_string_2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;random_string&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="s"&gt;"test_2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;RandomStringArgs&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;keepers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;None&lt;/span&gt;&lt;span class="nf"&gt;.into&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
            &lt;span class="n"&gt;length&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;new_length&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;lower&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;None&lt;/span&gt;&lt;span class="nf"&gt;.into&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
            &lt;span class="n"&gt;min_lower&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;None&lt;/span&gt;&lt;span class="nf"&gt;.into&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
            &lt;span class="n"&gt;min_numeric&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;None&lt;/span&gt;&lt;span class="nf"&gt;.into&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
            &lt;span class="n"&gt;min_special&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;None&lt;/span&gt;&lt;span class="nf"&gt;.into&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
            &lt;span class="n"&gt;min_upper&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;None&lt;/span&gt;&lt;span class="nf"&gt;.into&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
            &lt;span class="n"&gt;number&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;None&lt;/span&gt;&lt;span class="nf"&gt;.into&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
            &lt;span class="n"&gt;numeric&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;None&lt;/span&gt;&lt;span class="nf"&gt;.into&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
            &lt;span class="n"&gt;override_special&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;None&lt;/span&gt;&lt;span class="nf"&gt;.into&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
            &lt;span class="n"&gt;special&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;None&lt;/span&gt;&lt;span class="nf"&gt;.into&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
            &lt;span class="n"&gt;upper&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;None&lt;/span&gt;&lt;span class="nf"&gt;.into&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="nf"&gt;add_export&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"result"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;random_string_1&lt;/span&gt;&lt;span class="py"&gt;.result&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nf"&gt;add_export&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"number_1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;random_string_1&lt;/span&gt;&lt;span class="py"&gt;.length&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nf"&gt;add_export&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"number_2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;random_string_2&lt;/span&gt;&lt;span class="py"&gt;.length&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nf"&gt;Ok&lt;/span&gt;&lt;span class="p"&gt;(())&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Repositories
&lt;/h2&gt;

&lt;p&gt;Quick start example that uses Pulumi Random provider: &lt;a href="https://github.com/andrzejressel/pulumi-wasm-example" rel="noopener noreferrer"&gt;https://github.com/andrzejressel/pulumi-wasm-example&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The main repository is located here: &lt;a href="https://github.com/andrzejressel/pulumi-wasm" rel="noopener noreferrer"&gt;https://github.com/andrzejressel/pulumi-wasm&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Rustdocs for supported providers (cloudflare, docker and random) are available here: &lt;a href="https://andrzejressel.github.io/pulumi-wasm/rust-docs/pulumi_wasm_rust/index.html" rel="noopener noreferrer"&gt;https://andrzejressel.github.io/pulumi-wasm/rust-docs/pulumi_wasm_rust/index.html&lt;/a&gt;&lt;/p&gt;

</description>
      <category>devops</category>
      <category>rust</category>
      <category>opensource</category>
      <category>pulumi</category>
    </item>
  </channel>
</rss>
