Skip to main content

pulumi_gestalt_rust/
lib.rs

1mod macros;
2pub use macros::ToOutput;
3mod native;
4
5#[doc(hidden)]
6#[path = "private/mod.rs"]
7pub mod __private;
8mod input;
9mod oneof;
10mod pulumi_any;
11pub mod resources;
12pub mod stdlib;
13
14pub use input::Input;
15pub use pulumi_any::{PulumiAny, ToPulumiAny};
16
17pub use oneof::OneOf2;
18pub use oneof::OneOf3;
19pub use oneof::OneOf4;
20
21use anyhow::{Context as AnyhowContext, Result};
22pub use native::{
23    CompositeOutput, Context, CustomResourceOptions, InvokeResourceRequest, Provider,
24    RegisterResourceRequest, ResourceRequestObjectField,
25};
26pub use pulumi_gestalt_model::FromPulumiValue;
27pub use pulumi_gestalt_model::Output;
28pub use pulumi_gestalt_model::ToPulumiValue;
29use serde::{Deserialize, Serialize};
30use std::collections::BTreeMap;
31
32#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
33pub struct PackageParameterization {
34    pub name: String,
35    pub version: String,
36    pub value: Vec<u8>,
37}
38
39#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
40pub struct Package {
41    pub name: String,
42    pub kind: String,
43    pub version: String,
44    pub server: String,
45    pub checksums: BTreeMap<String, Vec<u8>>,
46    pub parameterization: Option<PackageParameterization>,
47}
48
49/// Entrypoint for execution
50/// ```rust,no_run
51/// pulumi_gestalt_rust::run(|ctx| {
52///     // your code here
53///     let output = ctx.new_output(&"Hello, Pulumi!".to_string());
54///     ctx.add_export("greeting", &output);
55///     Ok(())
56/// }).unwrap();
57pub fn run<F: Fn(&Context) -> Result<()>>(f: F) -> Result<()> {
58    run_with_packages(vec![], f)
59}
60
61pub fn run_with_packages<F: Fn(&Context) -> Result<()>>(
62    packages: Vec<Package>,
63    f: F,
64) -> Result<()> {
65    if try_write_packages_from_args(&packages)? {
66        return Ok(());
67    }
68
69    let ctx = Context::new();
70    f(&ctx).context("Failed to run Pulumi program")?;
71    ctx.finish();
72    Ok(())
73}
74
75fn try_write_packages_from_args(packages: &[Package]) -> Result<bool> {
76    let args = std::env::args().collect::<Vec<_>>();
77    if args.len() >= 3 && args[1] == "get-packages" {
78        let output_path = &args[2];
79        let serialized =
80            serde_json::to_string(packages).context("Failed to serialize packages metadata")?;
81        std::fs::write(output_path, serialized)
82            .with_context(|| format!("Failed to write packages file at [{output_path}]"))?;
83        return Ok(true);
84    }
85
86    Ok(false)
87}
88
89/// Load specific generated provider
90///
91/// build.rs:
92/// ```rust,no_run
93/// use std::error::Error;
94/// fn main() -> Result<(), Box<dyn Error>> {
95///     pulumi_gestalt_build::generate("random", "4.15.0")?;
96///     Ok(())
97/// }
98/// ```
99///
100/// lib.rs
101/// ```rust,ignore
102/// include_provider!("random");
103/// ```
104#[macro_export]
105macro_rules! include_provider {
106    ($file:expr) => {
107        include!(concat!(env!("OUT_DIR"), "/pulumi/", $file, "/lib.rs"));
108    };
109}