in block_register.go [28:58]
func RegisterBlock(t Block) {
bt := t.BlockType()
refKeyWord := bt
if s, ok := t.(BlockCustomizedRefType); ok {
refKeyWord = s.CustomizedRefType()
}
registry, ok := factories[bt]
if !ok {
registry = make(blockRegistry)
factories[bt] = registry
}
_, ok = refIters[refKeyWord]
if !ok {
refIters[refKeyWord] = iterator(refKeyWord, t.AddressLength())
}
validBlockTypes.Add(bt)
registry[t.Type()] = func(c Config, hb *HclBlock) Block {
newBlock := reflect.New(reflect.TypeOf(t).Elem()).Elem()
newBaseBlock := NewBaseBlock(c, hb)
newBaseBlock.setForEach(hb.ForEach)
newBaseBlock.setMetaNestedBlock()
newBlock.FieldByName("BaseBlock").Set(reflect.ValueOf(newBaseBlock))
b := newBlock.Addr().Interface().(Block)
if f, ok := baseFactory[bt]; ok {
blockName := cases.Title(language.English).String(bt)
newBlock.FieldByName("Base" + blockName).Set(reflect.ValueOf(f()))
}
defaults.SetDefaults(b)
return b
}
}