func RegisterBlock()

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
	}
}