This is an experimental OpenTofu function provider based on terraform-plugin-go.
It allows you to write Go helper functions next to your Tofu code, so that you can use them in your Tofu configuration, in a completely type-safe way. The provider is based on Yaegi, and most of the Go standard library is available.
In OpenTofu 1.7.0-beta1 and upwards you can configure the provider and pass it a Go file to load.
- The package name should be
lib
- Exported functions need to start with upper-case letters.
- The Tofu-facing name of the function will be lower-cased.
- It supports simple types, like strings, integers, floats, and booleans.
- It also supports complex type, like maps, slices, nullable pointers, and structures.
This feature is an experimental preview and is subject to change before the OpenTofu 1.7.0 release.
Example
// main.tf
provider "go" {
go = file("./lib.go")
}
output "test" {
value = provider::go::hello("papaya")
}
// lib.go
package lib
func Hello(name string) string {
return "Hello, " + name + "!"
}
Output excerpt:
Changes to Outputs:
+ test = "Hello, papaya!"
More involved example
// main.tf
provider "go" {
go = file("./lib.go")
}
output "test" {
value = provider::go::hello({
name = "papaya",
surname = "bacon",
})
}
// lib.go
package lib
import (
"fmt"
)
type Person struct {
// We can let it default to the un-capitalized field name.
Name string
// Or use a struct tag to specify the object field name explicitly.
Surname string `tf:"surname"`
}
func Hello(person Person) string {
return fmt.Sprintf("Hello, %s %s!", person.Name, person.Surname)
}
Output excerpt:
Changes to Outputs:
+ test = "Hello, papaya bacon!"
Moreover, all of this is type-safe and mistakes will be caught by tofu. So passing a number to the function will fail with object required
, while forgetting e.g. the surname will fail with attribute "surname" is required
.
Importing
Here's a snippet to require the provider in your OpenTofu configuration:
terraform {
required_providers {
go = {
source = "registry.opentofu.org/opentofu/go"
version = "0.0.1"
}
}
}