mirror of https://github.com/pulumi/pulumi.git
933c2027c5
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> |
||
---|---|---|
.. | ||
auto | ||
common | ||
pulumi | ||
pulumi-language-go | ||
Makefile | ||
README.md |
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
.