...
1 package datakinds
2
3 import (
4 "github.com/launchdarkly/go-server-sdk-evaluation/v2/ldmodel"
5 "github.com/launchdarkly/go-server-sdk/v6/subsystems/ldstoretypes"
6
7 "github.com/launchdarkly/go-jsonstream/v3/jreader"
8 )
9
10
11
12
13
14
15
16
17 var modelSerialization = ldmodel.NewJSONDataModelSerialization()
18
19
20
21
22
23
24
25 const deletedItemPlaceholderKey = "$deleted"
26
27
28 type featureFlagStoreDataKind struct{}
29 type segmentStoreDataKind struct{}
30
31
32 var Features DataKindInternal = featureFlagStoreDataKind{}
33
34
35 var Segments DataKindInternal = segmentStoreDataKind{}
36
37
38 func AllDataKinds() []ldstoretypes.DataKind {
39 return []ldstoretypes.DataKind{Features, Segments}
40 }
41
42
43 func (fk featureFlagStoreDataKind) GetName() string {
44 return "features"
45 }
46
47
48 func (fk featureFlagStoreDataKind) Serialize(item ldstoretypes.ItemDescriptor) []byte {
49 if item.Item == nil {
50 flag := ldmodel.FeatureFlag{Key: deletedItemPlaceholderKey, Version: item.Version, Deleted: true}
51 if bytes, err := modelSerialization.MarshalFeatureFlag(flag); err == nil {
52 return bytes
53 }
54 } else if flag, ok := item.Item.(*ldmodel.FeatureFlag); ok {
55 if bytes, err := modelSerialization.MarshalFeatureFlag(*flag); err == nil {
56 return bytes
57 }
58 }
59 return nil
60 }
61
62
63 func (fk featureFlagStoreDataKind) Deserialize(data []byte) (ldstoretypes.ItemDescriptor, error) {
64 flag, err := modelSerialization.UnmarshalFeatureFlag(data)
65 return maybeFlag(flag, err)
66 }
67
68
69 func (fk featureFlagStoreDataKind) DeserializeFromJSONReader(reader *jreader.Reader) (
70 ldstoretypes.ItemDescriptor, error) {
71 flag := ldmodel.UnmarshalFeatureFlagFromJSONReader(reader)
72 return maybeFlag(flag, reader.Error())
73 }
74
75 func maybeFlag(flag ldmodel.FeatureFlag, err error) (ldstoretypes.ItemDescriptor, error) {
76 if err != nil {
77 return ldstoretypes.ItemDescriptor{}, err
78 }
79 if flag.Deleted {
80 return ldstoretypes.ItemDescriptor{Version: flag.Version, Item: nil}, nil
81 }
82 return ldstoretypes.ItemDescriptor{Version: flag.Version, Item: &flag}, nil
83 }
84
85
86 func (fk featureFlagStoreDataKind) String() string {
87 return fk.GetName()
88 }
89
90
91 func (sk segmentStoreDataKind) GetName() string {
92 return "segments"
93 }
94
95
96 func (sk segmentStoreDataKind) Serialize(item ldstoretypes.ItemDescriptor) []byte {
97 if item.Item == nil {
98 segment := ldmodel.Segment{Key: deletedItemPlaceholderKey, Version: item.Version, Deleted: true}
99 if bytes, err := modelSerialization.MarshalSegment(segment); err == nil {
100 return bytes
101 }
102 } else if segment, ok := item.Item.(*ldmodel.Segment); ok {
103 if bytes, err := modelSerialization.MarshalSegment(*segment); err == nil {
104 return bytes
105 }
106 }
107 return nil
108 }
109
110
111 func (sk segmentStoreDataKind) Deserialize(data []byte) (ldstoretypes.ItemDescriptor, error) {
112 segment, err := modelSerialization.UnmarshalSegment(data)
113 return maybeSegment(segment, err)
114 }
115
116
117 func (sk segmentStoreDataKind) DeserializeFromJSONReader(reader *jreader.Reader) (ldstoretypes.ItemDescriptor, error) {
118 segment := ldmodel.UnmarshalSegmentFromJSONReader(reader)
119 return maybeSegment(segment, reader.Error())
120 }
121
122 func maybeSegment(segment ldmodel.Segment, err error) (ldstoretypes.ItemDescriptor, error) {
123 if err != nil {
124 return ldstoretypes.ItemDescriptor{}, err
125 }
126 if segment.Deleted {
127 return ldstoretypes.ItemDescriptor{Version: segment.Version, Item: nil}, nil
128 }
129 return ldstoretypes.ItemDescriptor{Version: segment.Version, Item: &segment}, nil
130 }
131
132
133 func (sk segmentStoreDataKind) String() string {
134 return sk.GetName()
135 }
136
View as plain text