pulumi/tests/testprovider/pulumi-gen-testprovider/main.go

112 lines
2.9 KiB
Go

// Copyright 2016-2021, Pulumi Corporation.
package main
import (
"flag"
"fmt"
"os"
"path/filepath"
"strings"
"github.com/pkg/errors"
dotnetgen "github.com/pulumi/pulumi/pkg/v3/codegen/dotnet"
gogen "github.com/pulumi/pulumi/pkg/v3/codegen/go"
nodejsgen "github.com/pulumi/pulumi/pkg/v3/codegen/nodejs"
pythongen "github.com/pulumi/pulumi/pkg/v3/codegen/python"
pschema "github.com/pulumi/pulumi/pkg/v3/codegen/schema"
"github.com/pulumi/pulumi/sdk/v3/go/common/tools"
"github.com/pulumi/pulumi/sdk/v3/go/common/util/contract"
provider "github.com/pulumi/pulumi/tests/testprovider/pulumi-resource-testprovider"
)
func main() {
flag.Usage = func() {
const usageFormat = "Usage: %s <languages>"
_, err := fmt.Fprintf(flag.CommandLine.Output(), usageFormat, os.Args[0])
contract.IgnoreError(err)
flag.PrintDefaults()
}
flag.Parse()
args := flag.Args()
if len(args) < 1 {
flag.Usage()
return
}
languages := args[0]
fullSpec := provider.GetSchema()
var err error
for _, language := range strings.Split(languages, ",") {
fmt.Printf("Generating %s...\n", language)
switch language {
case "nodejs", "python", "dotnet", "go":
dir := filepath.Join(".", "sdk", language)
err = emitPackage(fullSpec, language, dir)
default:
panic(fmt.Sprintf("Unrecognized language '%s'", language))
}
if err != nil {
panic(err)
}
}
}
func generate(ppkg *pschema.Package, language string) (map[string][]byte, error) {
toolDescription := "the Pulumi SDK Generator"
extraFiles := map[string][]byte{}
switch language {
case "nodejs":
return nodejsgen.GeneratePackage(toolDescription, ppkg, extraFiles)
case "python":
return pythongen.GeneratePackage(toolDescription, ppkg, extraFiles)
case "go":
return gogen.GeneratePackage(toolDescription, ppkg)
case "dotnet":
return dotnetgen.GeneratePackage(toolDescription, ppkg, extraFiles)
}
return nil, errors.Errorf("unknown language '%s'", language)
}
// emitPackage emits an entire package pack into the configured output directory with the configured settings.
func emitPackage(pkgSpec *pschema.PackageSpec, language, outDir string) error {
ppkg, err := pschema.ImportSpec(*pkgSpec, nil)
if err != nil {
return errors.Wrap(err, "reading schema")
}
files, err := generate(ppkg, language)
if err != nil {
return errors.Wrapf(err, "generating %s package", language)
}
for f, contents := range files {
if err := emitFile(outDir, f, contents); err != nil {
return errors.Wrapf(err, "emitting file %v", f)
}
}
return nil
}
// emitFile creates a file in a given directory and writes the byte contents to it.
func emitFile(outDir, relPath string, contents []byte) error {
p := filepath.Join(outDir, relPath)
if err := tools.EnsureDir(filepath.Dir(p)); err != nil {
return errors.Wrap(err, "creating directory")
}
f, err := os.Create(p)
if err != nil {
return errors.Wrap(err, "creating file")
}
defer contract.IgnoreClose(f)
_, err = f.Write(contents)
return err
}