pulumi/sdk/go
Aaron Friel 933c2027c5 Go generics proof of concept with interoperability
This is a proof of concept for implementing Output[T], provisionally called
Promise[T] in this branch. Deviating from the work of Joe Duffy, we seek to
maintain support for the existing Output type.

The OutputState type, whose internals were always hidden to users, are now
implemented using a promiseState[any]. That is, all Outputs embed a Promise.

This enables relatively seemless interoperability between Outputs and Promises.
Conversion to Promise[any] is a no-op, and conversion from Promise[T] to an
AnyOutput is handled with an Apply.

The new Promise *is* a Monad: apply is fmap and a join function is provided to
flatten Promise[Promise[T]]. This is because the type system does not otherwise
allow us to express that operation without a join.

---

This is a basic proof of concept for using Go generics in our Go
SDK. There were a number of "on the fly" design decisions made:

* Replace Input altogether.

* Keep Output[T], but it needs to be a struct largely due to the
  lack of generics support in the Go reflection library.

* Introduce AnyOutput as a base interface that all Output[*]s
  implement, which lets us treat any "outputtish" things uniformly.

This is enough to get the basic hello, world working:

  package main

  import (
      "github.com/pulumi/pulumi/sdk/v3/go/pulumi"
  )

  func main() {
      pulumi.Run(func(ctx *pulumi.Context) error {
          var bucket Bucket
          if err := ctx.RegisterResource("aws:s3/bucket:Bucket", "myBucket", pulumi.Map{}, &bucket); err != nil {
              return err
          }

          ctx.Export("bucketName", bucket.Bucket)

          nameLength := pulumi.Apply(bucket.Bucket, func(name string) int {
              return len(name)
          })
          ctx.Export("bucketNameLength", nameLength)

          return nil
      })
  }

There are plenty of embarassing hacks needed to get this to work,
and some blatent omissions too. For instance, I doubt Any works, and
obviously the tests won't run clean. Nevertheless, I wanted to save/
archive/share this work in the event that it's helpful to someone.

Joe Duffy <joe@pulumi.com>
Aaron Friel <friel@pulumi.com>
2022-09-25 18:11:08 -07:00
..
auto ci: Build binary with .exe extension on Windows 2022-09-21 17:55:00 -07:00
common Fix regression validating project files with `refresh: always` set 2022-09-22 11:51:54 -07:00
pulumi Go generics proof of concept with interoperability 2022-09-25 18:11:08 -07:00
pulumi-language-go Merge #10731 2022-09-22 00:40:38 +00:00
Makefile ci: Enable testing of language version sets 2022-09-21 09:48:38 -07:00
README.md `pulumi update` => `pulumi up` (#2702) 2019-05-06 14:00:18 -07:00

README.md

Pulumi Golang SDK

This directory contains support for writing Pulumi programs in the Go language. There are two aspects to this:

  • pulumi/ contains the client language bindings Pulumi program's code directly against;
  • pulumi-language-go/ contains the language host plugin that the Pulumi engine uses to orchestrate updates.

To author a Pulumi program in Go, simply say so in your Pulumi.yaml

name: <my-project>
runtime: go

and ensure you have pulumi-language-go on your path (it is distributed in the Pulumi download automatically).

By default, the language plugin will use your project's name, <my-project>, as the executable that it loads. This too must be on your path for the language provider to load it when you run pulumi preview or pulumi up.