@@ -316,21 +316,20 @@ extension Value {
316
316
members. append ( " last " )
317
317
}
318
318
members += [ " count " , " allButFirst " , " allButLast " ]
319
- if isConvertible ( to : . string) {
320
- members += [ " lines " , " words " , " characters " ]
319
+ if let string = self . as ( . string) {
320
+ members += string . members
321
321
}
322
- guard values . allSatisfy ( { $0 . isConvertible ( to : . number ) } ) else {
323
- return members + ( values . count == 1 ? values [ 0 ] . members : [ ] )
322
+ if !members . contains ( " alpha " ) , let color = self . as ( . color ) {
323
+ members += color . members
324
324
}
325
- if ( 1 ... 4 ) . contains ( values. count) {
326
- members += [ " red " , " green " , " blue " , " alpha " ]
327
- if values. count < 4 {
328
- members += [
329
- " x " , " y " , " z " ,
330
- " width " , " height " , " depth " ,
331
- " roll " , " yaw " , " pitch " ,
332
- ]
333
- }
325
+ if let vector = self . as ( . vector) {
326
+ members += vector. members
327
+ }
328
+ if let size = self . as ( . size) {
329
+ members += size. members
330
+ }
331
+ if let rotation = self . as ( . rotation) {
332
+ members += rotation. members
334
333
}
335
334
return members
336
335
case . range:
@@ -346,7 +345,11 @@ extension Value {
346
345
case . bounds:
347
346
return [ " min " , " max " , " size " , " center " , " width " , " height " , " depth " ]
348
347
case . string:
349
- return [ " lines " , " words " , " characters " ]
348
+ var members = [ " lines " , " words " , " characters " ]
349
+ if let color = self . as ( . color) {
350
+ members += color. members
351
+ }
352
+ return members
350
353
case let . object( values) :
351
354
return values. keys. sorted ( )
352
355
case . texture, . boolean, . number, . text:
@@ -400,25 +403,18 @@ extension Value {
400
403
return . number( Double ( values. count) )
401
404
case " lines " , " words " , " characters " :
402
405
return self . as ( . string) ? [ name]
403
- default :
404
- if let index = name. ordinalIndex {
405
- return index < values. count ? values [ index] : nil
406
- }
407
- }
408
- let numbers = values. compactMap { $0. as ( . number) ? . doubleValue }
409
- guard numbers. count == values. count else {
410
- return values. count == 1 ? values [ 0 ] [ name] : nil
411
- }
412
- switch name {
413
406
case " x " , " y " , " z " :
414
- return values . count < 4 ? Value . vector ( Vector ( numbers ) ) [ name] : nil
407
+ return self . as ( . vector) ? [ name]
415
408
case " width " , " height " , " depth " :
416
- return values . count < 4 ? Value . size ( Vector ( size : numbers ) ) [ name] : nil
409
+ return self . as ( . size) ? [ name]
417
410
case " roll " , " yaw " , " pitch " :
418
- return Rotation ( rollYawPitchInHalfTurns : numbers ) . map ( Value . rotation) ? [ name]
411
+ return self . as ( . rotation) ? [ name]
419
412
case " red " , " green " , " blue " , " alpha " :
420
- return Color ( numbers ) . map ( Value . color) ? [ name]
413
+ return self . as ( . color) ? [ name]
421
414
default :
415
+ if let index = name. ordinalIndex {
416
+ return index < values. count ? values [ index] : nil
417
+ }
422
418
return nil
423
419
}
424
420
case let . range( range) :
@@ -490,7 +486,10 @@ extension Value {
490
486
. map { . string( " \( $0) " ) } )
491
487
case " characters " :
492
488
return . tuple( string. map { . string( " \( $0) " ) } )
493
- default : return nil
489
+ case " red " , " green " , " blue " , " alpha " :
490
+ return self . as ( . color) ? [ name]
491
+ default :
492
+ return nil
494
493
}
495
494
case let . object( values) :
496
495
return values [ name]
0 commit comments