...
1 package growthbook
2
3 import (
4 "encoding/json"
5 "errors"
6 "time"
7 )
8
9 const dateLayout = "2006-01-02T15:04:05.000Z"
10
11 type FeatureAPIResponse struct {
12 Status int `json:"status"`
13 Features map[string]*Feature `json:"features"`
14 DateUpdated time.Time `json:"dateUpdated"`
15 EncryptedFeatures string `json:"encryptedFeatures"`
16 }
17
18
19
20 func (r *FeatureAPIResponse) MarshalJSON() ([]byte, error) {
21 type Alias FeatureAPIResponse
22 return json.Marshal(&struct {
23 *Alias
24 DateUpdated string `json:"dateUpdated"`
25 }{
26 Alias: (*Alias)(r),
27 DateUpdated: r.DateUpdated.Format(dateLayout),
28 })
29 }
30
31 func (r *FeatureAPIResponse) UnmarshalJSON(data []byte) error {
32 parsed := ParseFeatureAPIResponse(data)
33 if parsed == nil {
34 return errors.New("failed to parse feature API response")
35 }
36 r.Features = parsed.Features
37 r.DateUpdated = parsed.DateUpdated
38 r.EncryptedFeatures = parsed.EncryptedFeatures
39 return nil
40 }
41
42
43 func ParseFeatureAPIResponse(data []byte) *FeatureAPIResponse {
44 dict := make(map[string]interface{})
45 err := json.Unmarshal(data, &dict)
46 if err != nil {
47 logError("Failed parsing JSON input", "FeatureAPIResponse")
48 return nil
49 }
50 return BuildFeatureAPIResponse(dict)
51 }
52
53
54
55 func BuildFeatureAPIResponse(dict map[string]interface{}) *FeatureAPIResponse {
56 apiResponse := FeatureAPIResponse{}
57 for k, v := range dict {
58 switch k {
59 case "status":
60 status, ok := jsonInt(v, "FeatureAPIResponse", "status")
61 if !ok {
62 return nil
63 }
64 apiResponse.Status = status
65 case "features":
66 apiResponse.Features = BuildFeatures(v)
67 case "dateUpdated":
68 dateUpdated, ok := jsonString(v, "FeatureAPIResponse", "dateUpdated")
69 if !ok {
70 return nil
71 }
72 var err error
73 apiResponse.DateUpdated, err = time.Parse(dateLayout, dateUpdated)
74 if err != nil {
75 return nil
76 }
77 case "encryptedFeatures":
78 encryptedFeatures, ok := jsonString(v, "FeatureAPIResponse", "encryptedFeatures")
79 if !ok {
80 return nil
81 }
82 apiResponse.EncryptedFeatures = encryptedFeatures
83 default:
84 logWarn("Unknown key in JSON data", "FeatureAPIResponse", k)
85 }
86 }
87 return &apiResponse
88 }
89
View as plain text