in cft/build/build.go [164:229]
func (b builder) newPropertyType(resourceType, propertyType string) (interface{}, []*cft.Comment) {
defer func() {
if r := recover(); r != nil {
panic(fmt.Errorf("error building property type '%s.%s': %w", resourceType, propertyType, r))
}
}()
var ptSpec *spec.PropertyType
var ok bool
// If we've used a property from another resource type
// switch to that resource type for now
parts := strings.Split(propertyType, ".")
if len(parts) == 2 {
resourceType = parts[0]
}
ptSpec, ok = b.Spec.PropertyTypes[propertyType]
if !ok {
ptSpec, ok = b.Spec.PropertyTypes[resourceType+"."+propertyType]
}
if !ok {
panic(fmt.Errorf("unimplemented property type '%s.%s'", resourceType, propertyType))
}
// Deal with the case that a property type is directly a plain property
// for example AWS::Glue::SecurityConfiguration.S3Encryptions
if ptSpec.Property != emptyProp {
return b.newProperty(resourceType, propertyType, &ptSpec.Property)
}
comments := make([]*cft.Comment, 0)
// Generate properties
properties := make(map[string]interface{})
for name, pSpec := range ptSpec.Properties {
if b.IncludeOptionalProperties || pSpec.Required {
if !pSpec.Required {
comments = append(comments, &cft.Comment{
Path: []interface{}{name},
Value: optionalTag,
})
}
var p interface{}
var cs []*cft.Comment
if b.BuildIamPolicies && (name == policyDocument || name == assumeRolePolicyDocument) {
p, cs = iam.Policy()
} else if pSpec.Type == propertyType || pSpec.ItemType == propertyType {
p = make(map[string]interface{})
cs = make([]*cft.Comment, 0)
} else {
p, cs = b.newProperty(resourceType, name, pSpec)
}
properties[name] = p
for _, c := range cs {
c.Path = append([]interface{}{name}, c.Path...)
}
comments = append(comments, cs...)
}
}
return properties, comments
}