Skip to content

Commit

Permalink
upgrade AnyValue
Browse files Browse the repository at this point in the history
  • Loading branch information
nerzh committed Jul 15, 2021
1 parent 25db8fb commit 82b7158
Show file tree
Hide file tree
Showing 2 changed files with 122 additions and 31 deletions.
123 changes: 121 additions & 2 deletions Sources/TonClientSwift/Extensions/AnyValue.swift
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,20 @@ import Foundation
public enum AnyValue: Decodable, Encodable, Equatable {
case string(String)
case int(Int)
case int8(Int8)
case int16(Int16)
case int32(Int32)
case int64(Int64)
case uint(UInt)
case uint8(UInt8)
case uint16(UInt16)
case uint32(UInt32)
case uint64(UInt64)
case float(Float)
case float32(Float32)
case float64(Float64)
case double(Double)
case decimal(Decimal)
case bool(Bool)
case object([String: AnyValue])
case array([AnyValue])
Expand All @@ -26,10 +39,36 @@ public enum AnyValue: Decodable, Encodable, Equatable {
try container.encode(value)
case let .array(value):
try container.encode(value)
case let .nil(value):
try container.encode(value)
case let .double(value):
try container.encode(value)
case let .int8(value):
try container.encode(value)
case let .int16(value):
try container.encode(value)
case let .int32(value):
try container.encode(value)
case let .int64(value):
try container.encode(value)
case let .uint(value):
try container.encode(value)
case let .uint8(value):
try container.encode(value)
case let .uint16(value):
try container.encode(value)
case let .uint32(value):
try container.encode(value)
case let .uint64(value):
try container.encode(value)
case let .float(value):
try container.encode(value)
case let .float32(value):
try container.encode(value)
case let .float64(value):
try container.encode(value)
case let .decimal(value):
try container.encode(value)
case let .nil(value):
try container.encode(value)
}
}

Expand Down Expand Up @@ -124,6 +163,32 @@ public enum AnyValue: Decodable, Encodable, Equatable {
result = nil
case let .double(value):
result = value
case let .int8(value):
result = value
case let .int16(value):
result = value
case let .int32(value):
result = value
case let .int64(value):
result = value
case let .uint(value):
result = value
case let .uint8(value):
result = value
case let .uint16(value):
result = value
case let .uint32(value):
result = value
case let .uint64(value):
result = value
case let .float(value):
result = value
case let .float32(value):
result = value
case let .float64(value):
result = value
case let .decimal(value):
result = value
}

return result
Expand All @@ -132,5 +197,59 @@ public enum AnyValue: Decodable, Encodable, Equatable {
public func toDictionary() -> [String: Any?]? {
toAny() as? [String: Any?]
}
}


public func toAnyValue(_ value: Any) -> AnyValue {
if let value = value as? String {
return AnyValue.string(value)
} else if let value = value as? Int {
return AnyValue.int(value)
} else if let value = value as? Int8 {
return AnyValue.int8(value)
} else if let value = value as? Int16 {
return AnyValue.int16(value)
} else if let value = value as? Int32 {
return AnyValue.int32(value)
} else if let value = value as? Int64 {
return AnyValue.int64(value)
} else if let value = value as? UInt {
return AnyValue.uint(value)
} else if let value = value as? UInt8 {
return AnyValue.uint8(value)
} else if let value = value as? UInt16 {
return AnyValue.uint16(value)
} else if let value = value as? UInt32 {
return AnyValue.uint32(value)
} else if let value = value as? UInt64 {
return AnyValue.uint64(value)
} else if let value = value as? Float {
return AnyValue.float(value)
} else if let value = value as? Float32 {
return AnyValue.float32(value)
} else if let value = value as? Float64 {
return AnyValue.float64(value)
} else if let value = value as? Decimal {
return AnyValue.decimal(value)
} else if let value = value as? Double {
return AnyValue.double(value)
} else if let value = value as? Bool {
return AnyValue.bool(value)
} else if let value = value as? [String: Any] {
var dict: [String: AnyValue] = .init()
for (key, val) in value {
dict[key] = toAnyValue(val)
}
return AnyValue.object(dict)
} else if let value = value as? [Any] {
var array: [AnyValue] = .init()
for (val) in value {
array.append(toAnyValue(val))
}
return AnyValue.array(array)
} else {
return AnyValue.nil(nil)
// throw DecodingError.typeMismatch(JSONValue.self, DecodingError.Context(codingPath: container.codingPath, debugDescription: "Not a JSON"))
}
}

30 changes: 1 addition & 29 deletions Sources/TonClientSwift/Extensions/Dictionary.swift
Original file line number Diff line number Diff line change
Expand Up @@ -9,35 +9,7 @@ import Foundation

public extension Dictionary {

private func checkAnyValue(_ value: Any) -> AnyValue {
if let value = value as? String {
return AnyValue.string(value)
} else if let value = value as? Int {
return AnyValue.int(value)
} else if let value = value as? Double {
return AnyValue.double(value)
} else if let value = value as? Bool {
return AnyValue.bool(value)
} else if let value = value as? [String: Any] {
var dict: [String: AnyValue] = .init()
for (key, val) in value {
dict[key] = checkAnyValue(val)
}
return AnyValue.object(dict)
} else if let value = value as? [Any] {
var array: [AnyValue] = .init()
for (val) in value {
array.append(checkAnyValue(val))
}
return AnyValue.array(array)
} else {
return AnyValue.nil(nil)
// self = .nil(nil)
// throw DecodingError.typeMismatch(JSONValue.self, DecodingError.Context(codingPath: container.codingPath, debugDescription: "Not a JSON"))
}
}

func toAnyValue() -> AnyValue {
checkAnyValue(self)
TonClientSwift.toAnyValue(self)
}
}

0 comments on commit 82b7158

Please sign in to comment.