From fe12f6855d7d6d9ef10ebad66bfdd365f472ceff Mon Sep 17 00:00:00 2001 From: Danish Phiroz Date: Thu, 17 Oct 2024 13:07:19 -0400 Subject: [PATCH] Decoder error added for unexpected type --- MVMCore/MVMCore/Models/Model/ModelRegistry.swift | 7 ++++++- MVMCore/MVMCore/Utility/ReadableDecodingErrors.swift | 3 +++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/MVMCore/MVMCore/Models/Model/ModelRegistry.swift b/MVMCore/MVMCore/Models/Model/ModelRegistry.swift index 61fd511..1fcd1ad 100644 --- a/MVMCore/MVMCore/Models/Model/ModelRegistry.swift +++ b/MVMCore/MVMCore/Models/Model/ModelRegistry.swift @@ -18,6 +18,7 @@ public struct ModelRegistry { case decoderOther(message: String) case decoderErrorObjectNotPresent(codingKey: CodingKey, codingPath: [CodingKey]) case decoderErrorModelNotMapped(identifer: String? = nil, codingKey: CodingKey? = nil, codingPath: [CodingKey]? = nil) + case decoderErrorUnexpectedType(actualType: String? = nil, expectedType: String? = nil, identifer: String? = nil, codingKey: CodingKey? = nil, codingPath: [CodingKey]? = nil) case duplicateRegistration(message: String) case other(message: String) case handlerNotMapped(identifer: String? = nil, categoryName: String? = nil) @@ -90,6 +91,10 @@ public struct ModelRegistry { errorObject.title = "Decoder Error: Model Not Mapped" let codingPathConcat = codingPath?.compactMap { $0.stringValue }.joined(separator: " ") ?? "" errorObject.messageToLog = (identifer ?? "") + (codingKey?.stringValue ?? "") + codingPathConcat + case .decoderErrorUnexpectedType(let actualType, let expectedType, let identifer, let codingKey, let codingPath): + errorObject.title = "Decoder Error: Model Type Unexpected" + let codingPathConcat = codingPath?.compactMap { $0.stringValue }.joined(separator: " ") ?? "" + errorObject.messageToLog = "Actual Type: \(actualType ?? "") Expected Type: \(expectedType ?? "")" + (identifer ?? "") + (codingKey?.stringValue ?? "") + codingPathConcat case .handlerNotMapped(let identifer, let categoryName): errorObject.title = "Handler Not Mapped" errorObject.messageToLog = (identifer ?? "") + (categoryName ?? "") @@ -384,7 +389,7 @@ public extension UnkeyedDecodingContainer { """ MVMCoreLoggingHandler.logDebugMessage(withDelegate: logMessage) - throw ModelRegistry.Error.decoderErrorModelNotMapped(identifer: identifier, codingKey: typeCodingKey, codingPath: nestedContainer.codingPath) + throw ModelRegistry.Error.decoderErrorUnexpectedType(actualType: "\(mirror.subjectType)", expectedType: typeName, identifer: identifier, codingKey: typeCodingKey, codingPath: nestedContainer.codingPath) } } diff --git a/MVMCore/MVMCore/Utility/ReadableDecodingErrors.swift b/MVMCore/MVMCore/Utility/ReadableDecodingErrors.swift index 731d9f0..6eaf006 100644 --- a/MVMCore/MVMCore/Utility/ReadableDecodingErrors.swift +++ b/MVMCore/MVMCore/Utility/ReadableDecodingErrors.swift @@ -32,6 +32,9 @@ extension ModelRegistry.Error: HumanReadableDecodingErrorProtocol { case .decoderErrorModelNotMapped(let identifier, let codingKey, let codingPath) where identifier != nil && codingKey != nil && codingPath != nil: return "Model identifier \"\(identifier!)\" is not mapped for \"\(codingKey!.stringValue)\" @ \(codingPath!.map { return $0.stringValue })" + case .decoderErrorUnexpectedType(let actualType, let expectedType, let identifier, let codingKey, let codingPath) where actualType != nil && expectedType != nil && identifier != nil && codingKey != nil && codingPath != nil: + return "Model identifier \"\(identifier!)\" has unexpected type \"\(actualType!)\" expected type \"\(expectedType!)\" for \"\(codingKey!.stringValue)\" @ \(codingPath!.map { return $0.stringValue })" + case .decoderErrorObjectNotPresent(let codingKey, let codingPath): return "Required model \"\(codingKey.stringValue)\" was not found @ \(codingPath.map { return $0.stringValue })"