github.com/crossplane/upjet@v1.3.0/pkg/pipeline/terraformed.go (about)

     1  // SPDX-FileCopyrightText: 2023 The Crossplane Authors <https://crossplane.io>
     2  //
     3  // SPDX-License-Identifier: Apache-2.0
     4  
     5  package pipeline
     6  
     7  import (
     8  	"fmt"
     9  	"go/types"
    10  	"os"
    11  	"path/filepath"
    12  	"strings"
    13  
    14  	"github.com/muvaf/typewriter/pkg/wrapper"
    15  	"github.com/pkg/errors"
    16  
    17  	"github.com/crossplane/upjet/pkg/pipeline/templates"
    18  )
    19  
    20  // NewTerraformedGenerator returns a new TerraformedGenerator.
    21  func NewTerraformedGenerator(pkg *types.Package, rootDir, group, version string) *TerraformedGenerator {
    22  	return &TerraformedGenerator{
    23  		LocalDirectoryPath: filepath.Join(rootDir, "apis", strings.ToLower(strings.Split(group, ".")[0]), version),
    24  		LicenseHeaderPath:  filepath.Join(rootDir, "hack", "boilerplate.go.txt"),
    25  		pkg:                pkg,
    26  	}
    27  }
    28  
    29  // TerraformedGenerator generates conversion methods implementing Terraformed
    30  // interface on CRD structs.
    31  type TerraformedGenerator struct {
    32  	LocalDirectoryPath string
    33  	LicenseHeaderPath  string
    34  
    35  	pkg *types.Package
    36  }
    37  
    38  // Generate writes generated Terraformed interface functions
    39  func (tg *TerraformedGenerator) Generate(cfgs []*terraformedInput, apiVersion string) error {
    40  	for _, cfg := range cfgs {
    41  		trFile := wrapper.NewFile(tg.pkg.Path(), tg.pkg.Name(), templates.TerraformedTemplate,
    42  			wrapper.WithGenStatement(GenStatement),
    43  			wrapper.WithHeaderPath(tg.LicenseHeaderPath),
    44  		)
    45  		filePath := filepath.Join(tg.LocalDirectoryPath, fmt.Sprintf("zz_%s_terraformed.go", strings.ToLower(cfg.Kind)))
    46  
    47  		vars := map[string]any{
    48  			"APIVersion": apiVersion,
    49  		}
    50  		vars["CRD"] = map[string]string{
    51  			"Kind":               cfg.Kind,
    52  			"ParametersTypeName": cfg.ParametersTypeName,
    53  		}
    54  		vars["Terraform"] = map[string]any{
    55  			"ResourceType":  cfg.Name,
    56  			"SchemaVersion": cfg.TerraformResource.SchemaVersion,
    57  		}
    58  		vars["Sensitive"] = map[string]any{
    59  			"Fields": cfg.Sensitive.GetFieldPaths(),
    60  		}
    61  		vars["LateInitializer"] = map[string]any{
    62  			"IgnoredFields": cfg.LateInitializer.GetIgnoredCanonicalFields(),
    63  		}
    64  
    65  		if err := trFile.Write(filePath, vars, os.ModePerm); err != nil {
    66  			return errors.Wrapf(err, "cannot write the Terraformed interface implementation file %s", filePath)
    67  		}
    68  	}
    69  	return nil
    70  }