pulumi/tests/testdata/codegen/components-pp/go
Zaid Ajaj e88cd05f52
[sdk/program-gen] Implementing DeferredOutput for Go SDK and program-gen (#17885)
### Description

This PR addresses https://github.com/pulumi/pulumi/issues/17788 by
implementing a `pulumi.DeferredOutput(ctx)` function which can be used
for generating Go programs with mutually dependant components. The
implementation is as follows:
```go
// <sdk/go/internal/types.go>
// DeferredOutput creates an Output whose value can be later resolved from another Output instance.
func DeferredOutput[T any](ctx context.Context) (pulumix.Output[T], func(Output)) {
	var zero T
	rt := reflect.TypeOf(zero)
	state := internal.NewOutputState(nil, rt)
	out := pulumix.Output[T]{OutputState: state}
	resolve := func(o Output) {
		go func() {
			v, known, secret, deps, err := internal.AwaitOutput(ctx, o)
			if err != nil {
				internal.RejectOutput(state, err)
				return
			}
			internal.ResolveOutput(out, v, known, secret, deps)
		}()
	}
	return out, resolve
}
```

This PR implements the usage of this function in Go program-gen but the
results are far from ideal:
- ~Usage of deferred output variables requires an explicit cast from
`AnyOutput` to the target output type where it was used~ Now correctly
casting from the generic output type to target component inputs
- Generating lists of referenced components via a `ForExpression` emits
`"TODO: For expression"`

Example generated code in programs:
```go
secondPasswordLength, resolveSecondPasswordLength := pulumi.DeferredOutput[int](ctx)
first, err := NewFirst(ctx, "first", &FirstArgs{
	PasswordLength: pulumix.Cast[pulumi.IntOutput](secondPasswordLength),
})
```

Fixes #17788

---------

Co-authored-by: Julien <julien@caffeine.lu>
2025-01-04 18:47:30 +00:00
..
another-component.go Move codegen testdata (#15549) 2024-03-06 20:36:50 +00:00
components.go [sdk/program-gen] Implementing DeferredOutput for Go SDK and program-gen (#17885) 2025-01-04 18:47:30 +00:00
exampleComponent.go [program-gen/go] Fix optional primitive values being derefrenced (#15592) 2024-03-10 04:49:06 +00:00
simpleComponent.go Move codegen testdata (#15549) 2024-03-06 20:36:50 +00:00