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