Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix override logic #117

Merged
merged 1 commit into from
Jun 22, 2017
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
115 changes: 56 additions & 59 deletions schema/schema.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,19 +27,18 @@ func Make(files map[string][]byte) ([]*Template, error) {
overrideFiles = append(overrideFiles, file)
} else {
plains[file] = files[file]
if templates, err = appendTemplates(templates, file, files[file], false); err != nil {
return nil, err
}
}
}
// Override files are loaded last in alphabetical order.
sort.Strings(overrideFiles)
for _, file := range overrideFiles {
overrides[file] = files[file]
}

if templates, err = appendTemplates(templates, plains, false); err != nil {
return nil, err
}
if templates, err = appendTemplates(templates, overrides, true); err != nil {
return nil, err
if templates, err = appendTemplates(templates, file, files[file], true); err != nil {
return nil, err
}
}

return templates, nil
Expand Down Expand Up @@ -84,71 +83,69 @@ func (t *Template) Find(query ...string) []*Resource {
}
}

func appendTemplates(templates []*Template, files map[string][]byte, override bool) ([]*Template, error) {
for file, body := range files {
template := &Template{
File: file,
Resources: []*Resource{},
}
var ret map[string]map[string]interface{}
root, err := parser.Parse(body)
if err != nil {
return nil, err
}
if err := hcl.DecodeObject(&ret, root); err != nil {
return nil, err
}
func appendTemplates(templates []*Template, file string, body []byte, override bool) ([]*Template, error) {
template := &Template{
File: file,
Resources: []*Resource{},
}
var ret map[string]map[string]interface{}
root, err := parser.Parse(body)
if err != nil {
return nil, err
}
if err := hcl.DecodeObject(&ret, root); err != nil {
return nil, err
}

for resourceType, typeResources := range ret["resource"] {
for _, typeResource := range typeResources.([]map[string]interface{}) {
for key, attrs := range typeResource {
var newResource bool = true
var resourceItem *ast.ObjectItem = root.Node.(*ast.ObjectList).Filter("resource", resourceType, key).Items[0]
var resourcePos token.Pos = resourceItem.Val.Pos()
resourcePos.Filename = file
resource := &Resource{
File: file,
Type: resourceType,
Id: key,
Pos: resourcePos,
Attrs: map[string]*Attribute{},
}
for resourceType, typeResources := range ret["resource"] {
for _, typeResource := range typeResources.([]map[string]interface{}) {
for key, attrs := range typeResource {
var newResource bool = true
var resourceItem *ast.ObjectItem = root.Node.(*ast.ObjectList).Filter("resource", resourceType, key).Items[0]
var resourcePos token.Pos = resourceItem.Val.Pos()
resourcePos.Filename = file
resource := &Resource{
File: file,
Type: resourceType,
Id: key,
Pos: resourcePos,
Attrs: map[string]*Attribute{},
}

if override {
for _, temp := range templates {
if res := temp.Find("resource", resourceType, key); len(res) != 0 {
resource = res[0]
newResource = false
break
}
if override {
for _, temp := range templates {
if res := temp.Find("resource", resourceType, key); len(res) != 0 {
resource = res[0]
newResource = false
break
}
}
}

for _, attr := range attrs.([]map[string]interface{}) {
for k := range attr {
for _, attrToken := range resourceItem.Val.(*ast.ObjectType).List.Filter(k).Items {
if resource.Attrs[k] == nil || override {
resource.Attrs[k] = &Attribute{}
}
// The case of multiple specifiable keys such as `ebs_block_device`.
resource.Attrs[k].Vals = append(resource.Attrs[k].Vals, getToken(file, attrToken.Val))
pos := attrToken.Val.Pos()
pos.Filename = file
resource.Attrs[k].Poses = append(resource.Attrs[k].Poses, pos)
for _, attr := range attrs.([]map[string]interface{}) {
for k := range attr {
for _, attrToken := range resourceItem.Val.(*ast.ObjectType).List.Filter(k).Items {
if resource.Attrs[k] == nil || override {
resource.Attrs[k] = &Attribute{}
}
// The case of multiple specifiable keys such as `ebs_block_device`.
resource.Attrs[k].Vals = append(resource.Attrs[k].Vals, getToken(file, attrToken.Val))
pos := attrToken.Val.Pos()
pos.Filename = file
resource.Attrs[k].Poses = append(resource.Attrs[k].Poses, pos)
}
}
}

if newResource {
template.Resources = append(template.Resources, resource)
}
if newResource {
template.Resources = append(template.Resources, resource)
}
}
}
}

if !override {
templates = append(templates, template)
}
if !override {
templates = append(templates, template)
}

return templates, nil
Expand Down