github.com/bingoohuang/gg@v0.0.0-20240325092523-45da7dee9335/pkg/jsoni/extra/privat_fields.go (about)

     1  package extra
     2  
     3  import (
     4  	"strings"
     5  	"unicode"
     6  
     7  	"github.com/bingoohuang/gg/pkg/jsoni"
     8  )
     9  
    10  // SupportPrivateFields include private fields when encoding/decoding
    11  func SupportPrivateFields() {
    12  	jsoni.RegisterExtension(&privateFieldsExtension{})
    13  }
    14  
    15  type privateFieldsExtension struct {
    16  	jsoni.DummyExtension
    17  }
    18  
    19  func (extension *privateFieldsExtension) UpdateStructDescriptor(structDescriptor *jsoni.StructDescriptor) {
    20  	for _, binding := range structDescriptor.Fields {
    21  		if isPrivate := unicode.IsLower(rune(binding.Field.Name()[0])); !isPrivate {
    22  			continue
    23  		}
    24  
    25  		tag, hastag := binding.Field.Tag().Lookup("json")
    26  		if !hastag {
    27  			binding.FromNames = []string{binding.Field.Name()}
    28  			binding.ToNames = []string{binding.Field.Name()}
    29  			continue
    30  		}
    31  		tagParts := strings.Split(tag, ",")
    32  		names := calcFieldNames(binding.Field.Name(), tagParts[0], tag)
    33  		binding.FromNames = names
    34  		binding.ToNames = names
    35  	}
    36  }
    37  
    38  func calcFieldNames(originalFieldName string, tagProvidedFieldName string, wholeTag string) []string {
    39  	// ignore?
    40  	if wholeTag == "-" {
    41  		return []string{}
    42  	}
    43  	// rename?
    44  	var fieldNames []string
    45  	if tagProvidedFieldName == "" {
    46  		fieldNames = []string{originalFieldName}
    47  	} else {
    48  		fieldNames = []string{tagProvidedFieldName}
    49  	}
    50  	// private?
    51  	isNotExported := unicode.IsLower(rune(originalFieldName[0]))
    52  	if isNotExported {
    53  		fieldNames = []string{}
    54  	}
    55  	return fieldNames
    56  }