in generate/generate.go [542:605]
func generatePolymorphicProperty(typename string, name string, property Property) {
// Open the polymorphic property template
tmpl, err := template.New("polymorphic-property.template").Funcs(template.FuncMap{
"convertToGoType": convertTypeToGo,
}).ParseFiles("generate/templates/polymorphic-property.template")
nameParts := strings.Split(name, "_")
types := append([]string{}, property.PrimitiveTypes...)
types = append(types, property.PrimitiveItemTypes...)
types = append(types, property.ItemTypes...)
types = append(types, property.Types...)
packageName, err := packageName(typename, true)
if err != nil {
fmt.Printf("Error: Invalid CloudFormation resource %s\n%s\n", typename, err)
os.Exit(1)
}
templateData := struct {
Name string
PackageName string
Basename string
Property Property
Types []string
TypesJoined string
}{
Name: name,
PackageName: packageName,
Basename: nameParts[0],
Property: property,
Types: types,
TypesJoined: conjoin("or", types),
}
// Execute the template, writing it to file
var buf bytes.Buffer
err = tmpl.Execute(&buf, templateData)
if err != nil {
fmt.Printf("Error: Failed to generate polymorphic property %s\n%s\n", name, err)
os.Exit(1)
}
// Format the generated Go file with gofmt
formatted, err := format.Source(buf.Bytes())
if err != nil {
fmt.Printf("Error: Failed to format Go file for resource %s\n%s\n", name, err)
os.Exit(1)
}
// Ensure the package directory exists
dir := "cloudformation/" + packageName
if _, err := os.Stat(dir); os.IsNotExist(err) {
os.Mkdir(dir, 0755)
}
// Write the file out
if err := ioutil.WriteFile(dir+"/"+filename(name), formatted, 0644); err != nil {
fmt.Printf("Error: Failed to write JSON Schema\n%s\n", err)
os.Exit(1)
}
}