// FormatFieldName formats the field name as either CamelCase or snake_case func FormatFieldName(n string) string { switch options.Case { case Camel: return CamelCase(n) case Snake: return Underscore(n) } sterrors.Printf("Could not format string, Case is not set.\n") return n }
// TagStruct tags a struct based on whether or not it is exported, is ignored, and what flags are provided at runtime func TagStruct(srcData []byte, s *ast.StructType, offset *int) []byte { // If the last type name is one of our ignored structs, return immediately if IsIgnoredTypeName(lastTypeName) { return srcData } for _, f := range s.Fields.List { if len(f.Names) == 0 { sterrors.Printf("Could not find name for field: %+v\n", f) continue } if f.Names[0].IsExported() { name := f.Names[0].Name var formattedName string if IsIgnoredField(name) { formattedName = "-" } else { formattedName = FormatFieldName(name) } tag := f.Tag if tag != nil { val := tag.Value // remove `'s from string and convert to a reflect.StructTag so we can use reflect.StructTag().Get() call reflectTag := reflect.StructTag(val[1 : len(val)-1]) if options.AppendMode == SkipExisting || options.AppendMode == Append { currentTagValue := reflectTag.Get(options.Tag) if currentTagValue != "" { sterrors.Printf("Existing tag found: TagName: %s, TagValue: %s, StartIndex: %d, EndIndex: %d - Skipping Tag\n", options.Tag, currentTagValue, tag.Pos(), tag.End()) continue } } srcData = OverwriteStructTag(tag, formattedName, offset, srcData) } else { srcData = AppendStructTag(f, formattedName, offset, srcData) } } } return srcData }