1package attributevalue 2 3import ( 4 "reflect" 5 "strings" 6) 7 8type tag struct { 9 Name string 10 Ignore bool 11 OmitEmpty bool 12 OmitEmptyElem bool 13 NullEmpty bool 14 NullEmptyElem bool 15 AsString bool 16 AsBinSet, AsNumSet, AsStrSet bool 17 AsUnixTime bool 18} 19 20func (t *tag) parseAVTag(structTag reflect.StructTag) { 21 tagStr := structTag.Get("dynamodbav") 22 if len(tagStr) == 0 { 23 return 24 } 25 26 t.parseTagStr(tagStr) 27} 28 29func (t *tag) parseStructTag(tag string, structTag reflect.StructTag) { 30 tagStr := structTag.Get(tag) 31 if len(tagStr) == 0 { 32 return 33 } 34 35 t.parseTagStr(tagStr) 36} 37 38func (t *tag) parseTagStr(tagStr string) { 39 parts := strings.Split(tagStr, ",") 40 if len(parts) == 0 { 41 return 42 } 43 44 if name := parts[0]; name == "-" { 45 t.Name = "" 46 t.Ignore = true 47 } else { 48 t.Name = name 49 t.Ignore = false 50 } 51 52 for _, opt := range parts[1:] { 53 switch opt { 54 case "omitempty": 55 t.OmitEmpty = true 56 case "omitemptyelem": 57 t.OmitEmptyElem = true 58 case "nullempty": 59 t.NullEmpty = true 60 case "nullemptyelem": 61 t.NullEmptyElem = true 62 case "string": 63 t.AsString = true 64 case "binaryset": 65 t.AsBinSet = true 66 case "numberset": 67 t.AsNumSet = true 68 case "stringset": 69 t.AsStrSet = true 70 case "unixtime": 71 t.AsUnixTime = true 72 } 73 } 74} 75