in generate/generate.go [398:487]
func (rg *ResourceGenerator) generateGlobals(name string, global Global, spec *CloudFormationResourceSpecification) error {
// Open the resource template
tmpl, err := template.ParseFiles("generate/templates/globals.template")
if err != nil {
return fmt.Errorf("failed to load resource template: %s", err)
}
sname, basename := name, name
pname := "global"
iname, err := packageName(global.Reference, true)
if err != nil {
return err
}
properties := make(map[string]Property)
resource := spec.Resources[global.Reference]
for k, v := range resource.Properties {
if !global.isExcluded(k) {
properties[k] = v
}
}
templateData := struct {
Name string
ImportName string
ResourceName string
PackageName string
StructName string
Basename string
Properties map[string]Property
Documentation string
Version string
}{
Name: name,
ImportName: iname,
ResourceName: global.Reference,
PackageName: pname,
StructName: sname,
Basename: basename,
Properties: properties,
Documentation: resource.Documentation,
Version: spec.ResourceSpecificationVersion,
}
// Execute the template, writing it to a buffer
var buf bytes.Buffer
err = tmpl.Execute(&buf, templateData)
if err != nil {
return fmt.Errorf("failed to generate resource %s: %s", name, err)
}
// Format the generated Go code with gofmt
formatted, err := format.Source(buf.Bytes())
if err != nil {
fmt.Println(string(buf.Bytes()))
return fmt.Errorf("failed to format Go file for resource %s: %s", name, err)
}
// Check if the file has changed since the last time generate ran
dir := "cloudformation/" + pname
fn := dir + "/" + filename(name)
current, err := ioutil.ReadFile(fn)
if err != nil || bytes.Compare(formatted, current) != 0 {
// Create the directory if it doesn't exist
if _, err := os.Stat(dir); os.IsNotExist(err) {
os.Mkdir(dir, 0755)
}
// Write the file contents out
if err := ioutil.WriteFile(fn, formatted, 0644); err != nil {
return fmt.Errorf("failed to write resource file %s: %s", fn, err)
}
// Log the updated resource name to the results
rg.Results.UpdatedResources = append(rg.Results.UpdatedResources, GeneratedResource{
Name: name,
BaseName: basename,
PackageName: pname,
StructName: sname,
})
}
rg.Results.ProcessedCount++
return nil
}