in pkg/genlib/generator_with_custom_template.go [28:83]
func parseCustomTemplate(template []byte) ([]string, map[string][]byte, []byte) {
if len(template) == 0 {
return nil, nil, nil
}
tokenizer := regexp.MustCompile(`([^{]*)({{\.[^}]+}})*`)
allIndexes := tokenizer.FindAllSubmatchIndex(template, -1)
orderedFields := make([]string, 0, len(allIndexes))
templateFieldsMap := make(map[string][]byte, len(allIndexes))
var fieldPrefixBuffer []byte
var fieldPrefixPreviousN int
var trimTrailingTemplateN int
for i, loc := range allIndexes {
var fieldName []byte
var fieldPrefix []byte
if loc[4] > -1 && loc[5] > -1 {
fieldName = template[loc[4]+3 : loc[5]-2]
}
if loc[2] > -1 && loc[3] > -1 {
fieldPrefix = template[loc[2]:loc[3]]
}
if len(fieldName) == 0 {
if template[fieldPrefixPreviousN] == byte(123) {
fieldPrefixBuffer = append(fieldPrefixBuffer, byte(123))
} else {
if i == len(allIndexes)-1 {
fieldPrefixBuffer = template[trimTrailingTemplateN:]
} else {
fieldPrefixBuffer = append(fieldPrefixBuffer, fieldPrefix...)
fieldPrefixBufferIdx := bytes.Index(template[trimTrailingTemplateN:], fieldPrefixBuffer)
if fieldPrefixBufferIdx > 0 {
trimTrailingTemplateN += fieldPrefixBufferIdx
}
}
}
} else {
fieldPrefixBuffer = append(fieldPrefixBuffer, fieldPrefix...)
trimTrailingTemplateN = loc[5]
templateFieldsMap[string(fieldName)] = fieldPrefixBuffer
orderedFields = append(orderedFields, string(fieldName))
fieldPrefixBuffer = nil
}
fieldPrefixPreviousN = loc[2]
}
return orderedFields, templateFieldsMap, fieldPrefixBuffer
}