package configschema import ( "github.com/zclconf/go-cty/cty" ) // AttributeByPath looks up the Attribute schema which corresponds to the given // cty.Path. A nil value is returned if the given path does not correspond to a // specific attribute. func (b *Block) AttributeByPath(path cty.Path) *Attribute { block := b for i, step := range path { switch step := step.(type) { case cty.GetAttrStep: if attr := block.Attributes[step.Name]; attr != nil { // If the Attribute is defined with a NestedType and there's // more to the path, descend into the NestedType if attr.NestedType != nil && i < len(path)-1 { return attr.NestedType.AttributeByPath(path[i+1:]) } else if i < len(path)-1 { // There's more to the path, but not more to this Attribute. return nil } return attr } if nestedBlock := block.BlockTypes[step.Name]; nestedBlock != nil { block = &nestedBlock.Block continue } return nil } } return nil } // AttributeByPath recurses through a NestedType to look up the Attribute scheme // which corresponds to the given cty.Path. A nil value is returned if the given // path does not correspond to a specific attribute. func (o *Object) AttributeByPath(path cty.Path) *Attribute { for i, step := range path { switch step := step.(type) { case cty.GetAttrStep: if attr := o.Attributes[step.Name]; attr != nil { if attr.NestedType != nil && i < len(path)-1 { return attr.NestedType.AttributeByPath(path[i+1:]) } else if i < len(path)-1 { // There's more to the path, but not more to this Attribute. return nil } return attr } } } return nil }