pulumi_gestalt_rust/
input_or_output.rs

1use crate::{Context, Output};
2use pulumi_gestalt_rust_adapter::GestaltContext;
3use pulumi_gestalt_rust_adapter::GestaltOutput;
4use serde::Serialize;
5use serde::de::DeserializeOwned;
6
7/// Wrapper for either static value or [Output]
8pub enum InputOrOutput<T> {
9    StaticValue(T),
10    Output(Output<T>),
11}
12
13impl<T: Serialize> InputOrOutput<T> {
14    #[doc(hidden)]
15    pub fn get_output(self, engine: &Context) -> Output<T> {
16        match self {
17            InputOrOutput::StaticValue(value) => engine.new_output(&value),
18            InputOrOutput::Output(output) => output,
19        }
20    }
21}
22
23impl<T> From<Output<T>> for InputOrOutput<T> {
24    fn from(output: Output<T>) -> Self {
25        InputOrOutput::Output(output)
26    }
27}
28
29impl<T: Default + Serialize> Default for InputOrOutput<T> {
30    fn default() -> Self {
31        InputOrOutput::StaticValue(Default::default())
32    }
33}
34
35impl<T: Serialize> From<T> for InputOrOutput<T> {
36    fn from(value: T) -> InputOrOutput<T> {
37        InputOrOutput::StaticValue(value)
38    }
39}
40
41impl<T: Serialize> From<T> for InputOrOutput<Option<T>> {
42    fn from(value: T) -> Self {
43        InputOrOutput::StaticValue(Some(value))
44    }
45}
46
47impl<T: Serialize + DeserializeOwned> From<Output<T>> for InputOrOutput<Option<T>> {
48    fn from(output: Output<T>) -> Self {
49        InputOrOutput::Output(output.map(|v| Some(v)))
50    }
51}
52
53impl From<&str> for InputOrOutput<String> {
54    fn from(value: &str) -> Self {
55        InputOrOutput::StaticValue(value.to_string())
56    }
57}
58
59impl From<&str> for InputOrOutput<Option<String>> {
60    fn from(value: &str) -> Self {
61        InputOrOutput::StaticValue(Some(value.to_string()))
62    }
63}
64
65impl From<Vec<&str>> for InputOrOutput<Vec<String>> {
66    fn from(value: Vec<&str>) -> Self {
67        InputOrOutput::StaticValue(value.into_iter().map(|s| s.to_string()).collect())
68    }
69}
70
71impl From<Vec<&str>> for InputOrOutput<Option<Vec<String>>> {
72    fn from(value: Vec<&str>) -> Self {
73        InputOrOutput::StaticValue(Some(value.into_iter().map(|s| s.to_string()).collect()))
74    }
75}
76
77impl<T: Serialize, const N: usize> From<[T; N]> for InputOrOutput<Vec<T>>
78where
79    T: Serialize,
80{
81    fn from(value: [T; N]) -> Self {
82        InputOrOutput::StaticValue(value.into_iter().collect())
83    }
84}
85
86impl<T: Serialize, const N: usize> From<[T; N]> for InputOrOutput<Option<Vec<T>>>
87where
88    T: Serialize,
89{
90    fn from(value: [T; N]) -> Self {
91        InputOrOutput::StaticValue(Some(value.into_iter().collect()))
92    }
93}
94
95impl<const N: usize> From<[&str; N]> for InputOrOutput<Vec<String>> {
96    fn from(value: [&str; N]) -> Self {
97        InputOrOutput::StaticValue(value.into_iter().map(|s| s.to_string()).collect())
98    }
99}
100
101impl<const N: usize> From<[&str; N]> for InputOrOutput<Option<Vec<String>>> {
102    fn from(value: [&str; N]) -> Self {
103        InputOrOutput::StaticValue(Some(value.into_iter().map(|s| s.to_string()).collect()))
104    }
105}