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 }