|
1 | 1 | import Foundation |
2 | 2 |
|
3 | | -public enum FlagMetadataValue: Equatable, Codable { |
4 | | - case boolean(Bool) |
5 | | - case string(String) |
6 | | - case integer(Int64) |
7 | | - case double(Double) |
8 | | - |
9 | | - public static func of<T>(_ value: T) -> FlagMetadataValue? { |
10 | | - if let value = value as? Bool { |
11 | | - return .boolean(value) |
12 | | - } else if let value = value as? String { |
13 | | - return .string(value) |
14 | | - } else if let value = value as? Int64 { |
15 | | - return .integer(value) |
16 | | - } else if let value = value as? Double { |
17 | | - return .double(value) |
18 | | - } else { |
19 | | - return nil |
20 | | - } |
21 | | - } |
22 | | - |
23 | | - public func getTyped<T>() -> T? { |
24 | | - if let value = self as? T { |
25 | | - return value |
26 | | - } |
27 | | - |
28 | | - switch self { |
29 | | - case .boolean(let value): return value as? T |
30 | | - case .string(let value): return value as? T |
31 | | - case .integer(let value): return value as? T |
32 | | - case .double(let value): return value as? T |
33 | | - } |
34 | | - } |
35 | | - |
36 | | - public func asBoolean() -> Bool? { |
37 | | - if case let .boolean(bool) = self { |
38 | | - return bool |
39 | | - } |
40 | | - |
41 | | - return nil |
42 | | - } |
43 | | - |
44 | | - public func asString() -> String? { |
45 | | - if case let .string(string) = self { |
46 | | - return string |
47 | | - } |
48 | | - |
49 | | - return nil |
50 | | - } |
51 | | - |
52 | | - public func asInteger() -> Int64? { |
53 | | - if case let .integer(int64) = self { |
54 | | - return int64 |
55 | | - } |
56 | | - |
57 | | - return nil |
58 | | - } |
59 | | - |
60 | | - public func asDouble() -> Double? { |
61 | | - if case let .double(double) = self { |
62 | | - return double |
63 | | - } |
64 | | - |
65 | | - return nil |
66 | | - } |
67 | | -} |
68 | | - |
69 | | -extension FlagMetadataValue: CustomStringConvertible { |
70 | | - public var description: String { |
71 | | - switch self { |
72 | | - case .boolean(let value): |
73 | | - return "\(value)" |
74 | | - case .string(let value): |
75 | | - return value |
76 | | - case .integer(let value): |
77 | | - return "\(value)" |
78 | | - case .double(let value): |
79 | | - return "\(value)" |
80 | | - } |
81 | | - } |
82 | | -} |
83 | | - |
84 | | -extension FlagMetadataValue { |
85 | | - public func decode<T: Decodable>() throws -> T { |
86 | | - let data = try JSONSerialization.data(withJSONObject: toJson(value: self)) |
87 | | - return try JSONDecoder().decode(T.self, from: data) |
88 | | - } |
89 | | - |
90 | | - func toJson(value: FlagMetadataValue) -> Any { |
91 | | - switch value { |
92 | | - case .boolean(let bool): |
93 | | - return bool |
94 | | - case .string(let string): |
95 | | - return string |
96 | | - case .integer(let int64): |
97 | | - return int64 |
98 | | - case .double(let double): |
99 | | - return double |
100 | | - } |
101 | | - } |
102 | | -} |
| 3 | +public typealias FlagMetadata = [String: FlagMetadataValue] |
| 4 | +public typealias FlagMetadataValue = MetadataValue |
0 commit comments