@@ -47,8 +47,7 @@ struct Project: Codable, Equatable {
47
47
var sdkKey : String ?
48
48
var environmentKey : String ?
49
49
// Holdouts
50
- // This would be non optional once API is completed
51
- var holdouts : [ Holdout ] ?
50
+ var holdouts : [ Holdout ]
52
51
let logger = OPTLoggerFactory . getLogger ( )
53
52
54
53
// Required since logger is not decodable
@@ -63,6 +62,37 @@ struct Project: Codable, Equatable {
63
62
case holdouts
64
63
}
65
64
65
+ init ( from decoder: Decoder ) throws {
66
+ let container = try decoder. container ( keyedBy: CodingKeys . self)
67
+
68
+ // V2
69
+ version = try container. decode ( String . self, forKey: . version)
70
+ projectId = try container. decode ( String . self, forKey: . projectId)
71
+ experiments = try container. decode ( [ Experiment ] . self, forKey: . experiments)
72
+ audiences = try container. decode ( [ Audience ] . self, forKey: . audiences)
73
+ groups = try container. decode ( [ Group ] . self, forKey: . groups)
74
+ attributes = try container. decode ( [ Attribute ] . self, forKey: . attributes)
75
+ accountId = try container. decode ( String . self, forKey: . accountId)
76
+ events = try container. decode ( [ Event ] . self, forKey: . events)
77
+ revision = try container. decode ( String . self, forKey: . revision)
78
+
79
+ // V3
80
+ anonymizeIP = try container. decode ( Bool . self, forKey: . anonymizeIP)
81
+
82
+ // V4
83
+ rollouts = try container. decode ( [ Rollout ] . self, forKey: . rollouts)
84
+ integrations = try container. decodeIfPresent ( [ Integration ] . self, forKey: . integrations)
85
+ typedAudiences = try container. decodeIfPresent ( [ Audience ] . self, forKey: . typedAudiences)
86
+ featureFlags = try container. decode ( [ FeatureFlag ] . self, forKey: . featureFlags)
87
+ botFiltering = try container. decodeIfPresent ( Bool . self, forKey: . botFiltering)
88
+ sendFlagDecisions = try container. decodeIfPresent ( Bool . self, forKey: . sendFlagDecisions)
89
+ sdkKey = try container. decodeIfPresent ( String . self, forKey: . sdkKey)
90
+ environmentKey = try container. decodeIfPresent ( String . self, forKey: . environmentKey)
91
+
92
+ // Holdouts - defaults to empty array if key is not present
93
+ holdouts = try container. decodeIfPresent ( [ Holdout ] . self, forKey: . holdouts) ?? [ ]
94
+ }
95
+
66
96
// Required since logger is not equatable
67
97
static func == ( lhs: Project , rhs: Project ) -> Bool {
68
98
return lhs. version == rhs. version && lhs. projectId == rhs. projectId && lhs. experiments == rhs. experiments && lhs. holdouts == rhs. holdouts &&
0 commit comments