@@ -17,6 +17,7 @@ public enum ConfigurationAttributeName: String {
17
17
case setter
18
18
case escaping
19
19
case platforms
20
+ case projects
20
21
}
21
22
22
23
public enum ConfigurationAttribute : Hashable {
@@ -27,6 +28,7 @@ public enum ConfigurationAttribute: Hashable {
27
28
case setter( value: Bool )
28
29
case escaping( value: Bool )
29
30
case platforms( values: [ Platform ] )
31
+ case projects( values: [ String ] )
30
32
}
31
33
32
34
// MARK: - Target
@@ -64,6 +66,8 @@ extension ConfigurationAttribute: CustomStringConvertible {
64
66
return " Config Attr - escaping = \( value) "
65
67
case . platforms( let values) :
66
68
return " Config Attr - platforms = [ \( values. map { " . \( $0. rawValue) " } . joined ( separator: " , " ) ) ] "
69
+ case . projects( let values) :
70
+ return " Config Attr - Projects = [ \( values. joined ( separator: " , " ) ) ] "
67
71
}
68
72
}
69
73
@@ -83,6 +87,8 @@ extension ConfigurationAttribute: CustomStringConvertible {
83
87
return . escaping
84
88
case . platforms:
85
89
return . platforms
90
+ case . projects:
91
+ return . projects
86
92
}
87
93
}
88
94
}
@@ -111,7 +117,8 @@ extension ConfigurationAnnotation {
111
117
( . doesSupportObjc, . dependency) ,
112
118
( . setter, . dependency) ,
113
119
( . escaping, . dependency) ,
114
- ( . platforms, . dependency) :
120
+ ( . platforms, . dependency) ,
121
+ ( . projects, . dependency) :
115
122
return true
116
123
117
124
case ( . isIsolated, _) ,
@@ -120,7 +127,8 @@ extension ConfigurationAnnotation {
120
127
( . doesSupportObjc, _) ,
121
128
( . setter, _) ,
122
129
( . escaping, _) ,
123
- ( . platforms, _) :
130
+ ( . platforms, _) ,
131
+ ( . projects, _) :
124
132
return false
125
133
}
126
134
}
@@ -140,7 +148,8 @@ extension ConfigurationAnnotation {
140
148
( . setter, . registration) ,
141
149
( . doesSupportObjc, . registration) ,
142
150
( . escaping, . parameter) ,
143
- ( . platforms, _) :
151
+ ( . platforms, _) ,
152
+ ( . projects, _) :
144
153
return true
145
154
case ( . isIsolated, _) ,
146
155
( . scope, _) ,
@@ -173,6 +182,8 @@ extension ConfigurationAttribute {
173
182
self = . escaping( value: try ConfigurationAttribute . boolValue ( from: valueString) )
174
183
case . platforms:
175
184
self = . platforms( values: try ConfigurationAttribute . platformValues ( from: valueString) )
185
+ case . projects:
186
+ self = . projects( values: try ConfigurationAttribute . projectValues ( from: valueString) )
176
187
case . none:
177
188
throw TokenError . unknownConfigurationAttribute ( name: name)
178
189
}
@@ -194,15 +205,14 @@ extension ConfigurationAttribute {
194
205
}
195
206
196
207
private static func platformValues( from string: String ) throws -> [ Platform ] {
197
-
198
- var string = string. trimmingTrailingCharacters ( in: . whitespaces)
199
- guard string. first == " [ " && string. last == " ] " else {
200
- throw TokenError . invalidConfigurationAttributeValue ( value: string, expected: " Array of platforms (eg: `[.iOS, .watchOS, ...]`) " )
208
+ var parsedString = string. trimmingTrailingCharacters ( in: . whitespaces)
209
+ guard parsedString. first == " [ " && parsedString. last == " ] " else {
210
+ throw TokenError . invalidConfigurationAttributeValue ( value: parsedString, expected: " Array of platforms (eg: `[.iOS, .watchOS, ...]`) " )
201
211
}
202
- string . removeFirst ( )
203
- string . removeLast ( )
212
+ parsedString . removeFirst ( )
213
+ parsedString . removeLast ( )
204
214
205
- return try string
215
+ return try parsedString
206
216
. split ( separator: " , " )
207
217
. map { $0. trimmingCharacters ( in: . whitespaces) }
208
218
. map {
@@ -213,6 +223,19 @@ extension ConfigurationAttribute {
213
223
return platform
214
224
}
215
225
}
226
+
227
+ private static func projectValues( from string: String ) throws -> [ String ] {
228
+ var parsedString = string. trimmingTrailingCharacters ( in: . whitespaces)
229
+ guard parsedString. first == " [ " && parsedString. last == " ] " else {
230
+ throw TokenError . invalidConfigurationAttributeValue ( value: parsedString, expected: " Array of projects (eg: `[Calculator, Photos, ...]`) " )
231
+ }
232
+ parsedString. removeFirst ( )
233
+ parsedString. removeLast ( )
234
+
235
+ return parsedString
236
+ . split ( separator: " , " )
237
+ . map { $0. trimmingCharacters ( in: . whitespaces) . trimmingCharacters ( in: . punctuationCharacters) }
238
+ }
216
239
}
217
240
218
241
extension ConfigurationAttributeTarget {
@@ -241,7 +264,8 @@ extension ConfigurationAttribute {
241
264
242
265
case . scope,
243
266
. customBuilder,
244
- . platforms:
267
+ . platforms,
268
+ . projects:
245
269
return nil
246
270
}
247
271
}
@@ -256,7 +280,8 @@ extension ConfigurationAttribute {
256
280
. doesSupportObjc,
257
281
. setter,
258
282
. escaping,
259
- . platforms:
283
+ . platforms,
284
+ . projects:
260
285
return nil
261
286
}
262
287
}
@@ -271,7 +296,8 @@ extension ConfigurationAttribute {
271
296
. doesSupportObjc,
272
297
. setter,
273
298
. escaping,
274
- . platforms:
299
+ . platforms,
300
+ . projects:
275
301
return nil
276
302
}
277
303
}
@@ -280,13 +306,30 @@ extension ConfigurationAttribute {
280
306
switch self {
281
307
case . platforms( let values) :
282
308
return values
283
-
309
+
310
+ case . scope,
311
+ . customBuilder,
312
+ . isIsolated,
313
+ . setter,
314
+ . escaping,
315
+ . doesSupportObjc,
316
+ . projects:
317
+ return nil
318
+ }
319
+ }
320
+
321
+ var projectValues : [ String ] ? {
322
+ switch self {
323
+ case . projects( let values) :
324
+ return values
325
+
284
326
case . scope,
285
327
. customBuilder,
286
328
. isIsolated,
287
329
. setter,
288
330
. escaping,
289
- . doesSupportObjc:
331
+ . doesSupportObjc,
332
+ . platforms:
290
333
return nil
291
334
}
292
335
}
0 commit comments