Skip to content

Rust

Please Read First

Before processing, make sure to learn about Pulumi

TL/DR

Example project is available at pulumi-gestalt-example

Support for Rust is provided in two flavors:

  • Native
  • Wasm

If you don't know which one to choose, go with the native version. Currently, Wasm doesn’t give any benefits and is more complex to use.

Requirements

  • Rust
  • Just
  • Pulumi Gestalt language plugin: pulumi plugin install language gestalt "<PULUMI_GESTALT_VERSION>" --server github://api.github.com/andrzejressel/pulumi-gestalt-releases
  • (Wasm only) Pulumi Gestalt Wasm Runner: cargo binstall -y --index "sparse+https://cargo.cloudsmith.io/andrzej-ressel-github/pulumi-gestalt/" pulumi_gestalt_wasm_runner@<PULUMI_GESTALT_VERSION>

Project setup

Add Repository

.cargo/config.toml
[registries.pulumi-gestalt]
index = "sparse+https://cargo.cloudsmith.io/andrzej-ressel-github/pulumi-gestalt/"

Add dependencies

Cargo.toml
[dependencies]
pulumi_gestalt_rust = {version = "=<PULUMI_GESTALT_VERSION>", registry = "pulumi-gestalt"}
anyhow = "1.0.95"
bon = "3.3.1"

[build-dependencies]
pulumi_gestalt_build = { version = "=<PULUMI_GESTALT_VERSION>", registry = "pulumi-gestalt" }

Generate provider code

build.rs
use std::error::Error;
fn main() -> Result<(), Box<dyn Error>> {
    pulumi_gestalt_build::generate("random", "4.15.0")?;
    Ok(())
}

Include provider code

src/random.rs
pulumi_gestalt_rust::include_provider!("random");

Use provider

src/main.rs
mod random;
use anyhow::Result;
use random::random_string;
use random::random_string::RandomStringArgs;
use pulumi_gestalt_rust::*;

pulumi_main!();

fn pulumi_main(context: &Context) -> Result<()> {
    let length: Output<i32> = context.new_output(&4);
    let random_string_1 = random_string::create(
        context,
        "test_1",
        RandomStringArgs::builder().length(length).build_struct(),
    );

    let new_length = random_string_1.result.map(|s| s.len() as i32);

    let random_string_2 = random_string::create(
        context,
        "test_2",
        RandomStringArgs::builder()
            .length(new_length)
            .build_struct(),
    );

    let random_string_3 = random_string::create(
        context,
        "test_3",
        RandomStringArgs::builder()
            .length(random_string_2.length.map(|i| i * 2))
            .build_struct(),
    );

    add_export("result", &random_string_1.result);
    add_export("number_1", &random_string_1.length);
    add_export("number_2", &random_string_2.length);
    add_export("number_3", &random_string_3.length);
    Ok(())
}
src/lib.rs
mod random;
use anyhow::Result;
use random::random_string;
use random::random_string::RandomStringArgs;
use pulumi_gestalt_rust::*;

pulumi_main!();

fn pulumi_main(context: &Context) -> Result<()> {
    let length: Output<i32> = context.new_output(&4);
    let random_string_1 = random_string::create(
        context,
        "test_1",
        RandomStringArgs::builder().length(length).build_struct(),
    );

    let new_length = random_string_1.result.map(|s| s.len() as i32);

    let random_string_2 = random_string::create(
        context,
        "test_2",
        RandomStringArgs::builder()
            .length(new_length)
            .build_struct(),
    );

    let random_string_3 = random_string::create(
        context,
        "test_3",
        RandomStringArgs::builder()
            .length(random_string_2.length.map(|i| i * 2))
            .build_struct(),
    );

    add_export("result", &random_string_1.result);
    add_export("number_1", &random_string_1.length);
    add_export("number_2", &random_string_2.length);
    add_export("number_3", &random_string_3.length);
    Ok(())
}

(the difference is in the main.rs vs lib.rs file name)

Add Pulumi.yaml

Pulumi.yaml
name: Pulumi-Gestalt-Example
runtime: gestalt

Add justfile

justfile
run:
    cargo run
justfile
binary := "pulumi_gestalt_wasm_runner"
wasm := "target/wasm32-wasip2/debug/<PROJECT_NAME>.wasm"
WASI_TARGET := "wasm32-wasip2"

run:
    cargo build --target={{WASI_TARGET}}
    {{binary}} run --debug "{{wasm}}"

You can now setup Pulumi stack using pulumi stack and run program using pulumi up