Line items update
This commit is contained in:
parent
e2885b0f78
commit
a9da777f56
@ -75,22 +75,7 @@ extension KeyedDecodingContainer where Key: CodingKey {
|
|||||||
guard var container = try? nestedUnkeyedContainer(forKey: codingKey) else {
|
guard var container = try? nestedUnkeyedContainer(forKey: codingKey) else {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
var models = [Model]()
|
return try container.decodeModelsIfPresent(typeCodingKey: typeCodingKey)
|
||||||
var containerCopy = container
|
|
||||||
while !container.isAtEnd {
|
|
||||||
let nestedContainer = try container.nestedContainer(keyedBy: TypeKey.self)
|
|
||||||
if let identifier = try nestedContainer.decodeIfPresent(String.self, forKey: typeCodingKey) {
|
|
||||||
//get the type
|
|
||||||
guard let type = ModelRegistry.getType(for: identifier) else {
|
|
||||||
throw ModelRegistry.Error.decoderErrorModelNotMapped
|
|
||||||
}
|
|
||||||
//now get the decoder to use for the type
|
|
||||||
let decoder = try containerCopy.superDecoder()
|
|
||||||
let model = try type.init(from: decoder)
|
|
||||||
models.append(model)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return models
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Decodes an array of registered model based on the identifiers.
|
/// Decodes an array of registered model based on the identifiers.
|
||||||
@ -100,6 +85,22 @@ extension KeyedDecodingContainer where Key: CodingKey {
|
|||||||
}
|
}
|
||||||
return models
|
return models
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Decodes an array with arrays of models based on the identifiers, optional.
|
||||||
|
public func decodeModels2DIfPresent<TypeKey: CodingKey>(codingKey: KeyedDecodingContainer<K>.Key, typeCodingKey: TypeKey) throws -> [[Model]]? {
|
||||||
|
guard var container = try? nestedUnkeyedContainer(forKey: codingKey) else {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return try container.decodeModels2DIfPresent(typeCodingKey: typeCodingKey)
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Decodes an array with arrays of models based on the identifiers.
|
||||||
|
public func decodeModels2D<TypeKey: CodingKey>(codingKey: KeyedDecodingContainer<K>.Key, typeCodingKey: TypeKey) throws -> [[Model]] {
|
||||||
|
guard let models: [[Model]] = try decodeModels2DIfPresent(codingKey: codingKey, typeCodingKey: typeCodingKey) else {
|
||||||
|
throw ModelRegistry.Error.decoderErrorObjectNotPresent
|
||||||
|
}
|
||||||
|
return models
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
extension KeyedEncodingContainer where Key: CodingKey {
|
extension KeyedEncodingContainer where Key: CodingKey {
|
||||||
@ -131,4 +132,52 @@ extension KeyedEncodingContainer where Key: CodingKey {
|
|||||||
try model.encode(unkeyedContainer: &unkeyedContainer)
|
try model.encode(unkeyedContainer: &unkeyedContainer)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Convenience function for encoding the container into a list of lists of Models. needs instance type as input paramaeter list
|
||||||
|
public mutating func encodeModels2D(_ list: [[Model]]?, forKey key:KeyedEncodingContainer<K>.Key) throws {
|
||||||
|
guard let list = list else { return }
|
||||||
|
var unkeyedContainer = self.nestedUnkeyedContainer(forKey: key)
|
||||||
|
for models in list {
|
||||||
|
var arrayunkeyedContainer = unkeyedContainer.nestedUnkeyedContainer()
|
||||||
|
for model in models {
|
||||||
|
try model.encode(unkeyedContainer: &arrayunkeyedContainer)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
extension UnkeyedDecodingContainer {
|
||||||
|
/// Decodes the container into a list of Models.
|
||||||
|
public mutating func decodeModelsIfPresent<TypeKey: CodingKey>(typeCodingKey: TypeKey) throws -> [Model]? {
|
||||||
|
var models = [Model]()
|
||||||
|
var containerCopy = self
|
||||||
|
while !containerCopy.isAtEnd {
|
||||||
|
let nestedContainer = try containerCopy.nestedContainer(keyedBy: TypeKey.self)
|
||||||
|
if let identifier = try nestedContainer.decodeIfPresent(String.self, forKey: typeCodingKey) {
|
||||||
|
//get the type
|
||||||
|
guard let type = ModelRegistry.getType(for: identifier) else {
|
||||||
|
throw ModelRegistry.Error.decoderErrorModelNotMapped
|
||||||
|
}
|
||||||
|
//now get the decoder to use for the type
|
||||||
|
let decoder = try self.superDecoder()
|
||||||
|
let model = try type.init(from: decoder)
|
||||||
|
models.append(model)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return models
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Convenience function for decoding the container into a list of lists of Models.
|
||||||
|
public mutating func decodeModels2DIfPresent<TypeKey: CodingKey>(typeCodingKey: TypeKey) throws -> [[Model]]? {
|
||||||
|
var modelLists = [[Model]]()
|
||||||
|
var containerCopy = self
|
||||||
|
while !containerCopy.isAtEnd {
|
||||||
|
var arraycontainerCopy = try containerCopy.nestedUnkeyedContainer()
|
||||||
|
guard let models = try arraycontainerCopy.decodeModelsIfPresent(typeCodingKey: typeCodingKey) else {
|
||||||
|
throw ModelRegistry.Error.decoderErrorModelNotMapped
|
||||||
|
}
|
||||||
|
modelLists.append(models)
|
||||||
|
}
|
||||||
|
return modelLists
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user