mirror of https://github.com/pulumi/pulumi.git
112 lines
2.9 KiB
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
|
|
}
|