Skip to content

Commit 2388416

Browse files
committed
Ensure we generate correct metadata for NSNumber types
1 parent 055a404 commit 2388416

File tree

3 files changed

+41
-19
lines changed

3 files changed

+41
-19
lines changed

Sources/SwiftGenKit/Utils/Metadata.swift

Lines changed: 33 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -36,36 +36,58 @@ enum Metadata {
3636
/// - Parameter data: The value to describe
3737
/// - Returns: Dictionary with type information about the value (for Stencil context)
3838
static func generate(for data: Any) -> [String: Any] {
39-
switch data {
40-
case is String:
39+
let dataType = type(of: data)
40+
41+
if data is String {
4142
return [Key.type: ValueType.string]
42-
case is Bool:
43+
} else if dataType == Bool.self {
4344
return [Key.type: ValueType.bool]
44-
case is Int:
45+
} else if dataType == Int.self {
4546
return [Key.type: ValueType.int]
46-
case is Double:
47+
} else if dataType == Double.self {
4748
return [Key.type: ValueType.double]
48-
case is Date:
49+
} else if dataType == Date.self {
4950
return [Key.type: ValueType.date]
50-
case is Data:
51+
} else if dataType == Data.self {
5152
return [Key.type: ValueType.data]
52-
case let data as [Any]:
53+
} else if let data = data as? NSNumber {
54+
return generate(for: data)
55+
} else if let data = data as? [Any] {
5356
return [
5457
Key.type: ValueType.array,
5558
Key.element: Metadata.describe(arrayElement: data)
5659
]
57-
case let data as [String: Any]:
60+
} else if let data = data as? [String: Any] {
5861
return [
5962
Key.type: ValueType.dictionary,
6063
Key.properties: Metadata.describe(dictionary: data)
6164
]
62-
case is NSNull, nil:
65+
} else if dataType == NSNull.self || Mirror(reflecting: data).displayStyle == .optional {
6366
return [Key.type: ValueType.optional]
64-
default:
67+
} else {
6568
return [Key.type: ValueType.any]
6669
}
6770
}
6871

72+
static func generate(for number: NSNumber) -> [String: Any] {
73+
if CFGetTypeID(number) == CFBooleanGetTypeID() {
74+
return [Key.type: ValueType.bool]
75+
} else {
76+
switch CFNumberGetType(number) {
77+
case .sInt8Type, .sInt16Type, .sInt32Type, .sInt64Type, .charType, .intType, .longType, .longLongType:
78+
return [Key.type: ValueType.int]
79+
case .float32Type, .float64Type, .floatType, .doubleType:
80+
return [Key.type: ValueType.double]
81+
case .nsIntegerType:
82+
return [Key.type: ValueType.int]
83+
case .cgFloatType:
84+
return [Key.type: ValueType.double]
85+
default:
86+
return [Key.type: ValueType.any]
87+
}
88+
}
89+
}
90+
6991
private static func describe(dictionary: [String: Any]) -> [String: Any] {
7092
Dictionary(
7193
uniqueKeysWithValues: dictionary.map { item in

Tests/Fixtures/StencilContexts/JSON/all.yaml

Lines changed: 4 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Tests/Fixtures/StencilContexts/JSON/configuration.yaml

Lines changed: 4 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)