-
-
Save vukcevich/7f765f5cb49412ed1b5c654b40ce6c4d to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// | |
// anyCodabelValue.swift | |
// Sajjad Sarkoobi | |
// | |
// Created by Sajjad Sarkoobi on 6/8/20. | |
// Copyright © 2020 Sajjad Sarkoobi. All rights reserved. | |
// Email: [email protected] | |
import Foundation | |
enum AnyCodableValue: Codable { | |
case integer(Int) | |
case string(String) | |
case float(Float) | |
case double(Double) | |
case boolean(Bool) | |
case null | |
init(from decoder: Decoder) throws { | |
let container = try decoder.singleValueContainer() | |
if let x = try? container.decode(Int.self) { | |
self = .integer(x) | |
return | |
} | |
if let x = try? container.decode(String.self) { | |
self = .string(x) | |
return | |
} | |
if let x = try? container.decode(Float.self) { | |
self = .float(x) | |
return | |
} | |
if let x = try? container.decode(Double.self) { | |
self = .double(x) | |
return | |
} | |
if let x = try? container.decode(Bool.self) { | |
self = .boolean(x) | |
return | |
} | |
if let x = try? container.decode(String.self) { | |
self = .string(x) | |
return | |
} | |
if let _ = try? container.decodeNil() { | |
self = .string("") | |
return | |
} | |
throw DecodingError.typeMismatch(AnyCodableValue.self, DecodingError.Context(codingPath: decoder.codingPath, debugDescription: "Wrong type")) | |
} | |
func encode(to encoder: Encoder) throws { | |
var container = encoder.singleValueContainer() | |
switch self { | |
case .integer(let x): | |
try container.encode(x) | |
case .string(let x): | |
try container.encode(x) | |
case .float(let x): | |
try container.encode(x) | |
case .double(let x): | |
try container.encode(x) | |
case .boolean(let x): | |
try container.encode(x) | |
case .null: | |
try container.encode(self) | |
break | |
} | |
} | |
//Get safe Values | |
var stringValue: String { | |
switch self { | |
case .string(let s): | |
return s | |
case .integer(let s): | |
return "\(s)" | |
case .double(let s): | |
return "\(s)" | |
case .float(let s): | |
return "\(s)" | |
default: | |
return "" | |
} | |
} | |
var intValue: Int { | |
switch self { | |
case .integer(let s): | |
return s | |
case .string(let s): | |
return (Int(s) ?? 0) | |
case .float(let s): | |
return Int(s) | |
case .null: | |
return 0 | |
default: | |
return 0 | |
} | |
} | |
var floatValue: Float { | |
switch self { | |
case .float(let s): | |
return s | |
case .integer(let s): | |
return Float(s) | |
case .string(let s): | |
return (Float(s) ?? 0) | |
default: | |
return 0 | |
} | |
} | |
var doubleValue: Double { | |
switch self { | |
case .double(let s): | |
return s | |
case .string(let s): | |
return (Double(s) ?? 0.0) | |
case .integer(let s): | |
return (Double(s)) | |
case .float(let s): | |
return (Double(s) ?? 0.0) | |
default: | |
return 0.0 | |
} | |
} | |
var booleanValue: Bool { | |
switch self { | |
case .boolean(let s): | |
return s | |
case .integer(let s): | |
return s == 1 | |
case .string(let s): | |
let bool = (Int(s) ?? 0) == 1 | |
return bool | |
default: | |
return false | |
} | |
} | |
} | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment