template protocol update
This commit is contained in:
parent
c276b09d74
commit
35f1cc5c17
@ -8,43 +8,46 @@
|
|||||||
|
|
||||||
import Foundation
|
import Foundation
|
||||||
|
|
||||||
public protocol TemplateProtocol: AnyObject {
|
public protocol TemplateProtocol: AnyObject, PageProtocol {
|
||||||
associatedtype TemplateModel: TemplateModelProtocol
|
associatedtype TemplateModel: TemplateModelProtocol
|
||||||
var templateModel: TemplateModel? { get set }
|
var templateModel: TemplateModel? { get set }
|
||||||
|
|
||||||
func decodeTemplate(using decoder: JSONDecoder, from data: Data) throws -> TemplateModel
|
func decodeTemplate(using decoder: JSONDecoder, from data: Data) throws -> TemplateModel
|
||||||
}
|
}
|
||||||
|
|
||||||
public extension TemplateProtocol where Self: ViewController {
|
public extension TemplateProtocol {
|
||||||
|
|
||||||
|
// Utilize existing underlying property
|
||||||
|
var templateModel: TemplateModel? {
|
||||||
|
get {
|
||||||
|
pageModel as? TemplateModel
|
||||||
|
}
|
||||||
|
set {
|
||||||
|
var mutableSelf = self
|
||||||
|
mutableSelf.pageModel = newValue
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Helper function to do common parsing logic.
|
||||||
func parseTemplate(json: [AnyHashable: Any]?) throws {
|
func parseTemplate(json: [AnyHashable: Any]?) throws {
|
||||||
guard let pageJSON = json else { return }
|
guard let pageJSON = json else { return }
|
||||||
|
let delegateObject = (self as? MVMCoreViewControllerProtocol)?.delegateObject?() as? MVMCoreUIDelegateObject
|
||||||
let data = try JSONSerialization.data(withJSONObject: pageJSON)
|
let data = try JSONSerialization.data(withJSONObject: pageJSON)
|
||||||
let decoder = JSONDecoder()
|
let decoder = JSONDecoder()
|
||||||
try decoder.add(delegateObject: delegateObjectIVar)
|
if let delegateObject = delegateObject {
|
||||||
|
// Add the delegate to access mid parsing if applicable.
|
||||||
|
try decoder.add(delegateObject: delegateObject)
|
||||||
|
}
|
||||||
templateModel = try decodeTemplate(using: decoder, from: data)
|
templateModel = try decodeTemplate(using: decoder, from: data)
|
||||||
model = templateModel as? MVMControllerModelProtocol
|
|
||||||
guard let model = model else { return }
|
// Add additional required behaviors if applicable.
|
||||||
traverseAndAddRequiredBehaviors()
|
guard var behaviorHandlerModel = templateModel as? TemplateModelProtocol & PageBehaviorHandlerModelProtocol,
|
||||||
var behaviorHandler = self
|
var behaviorHandler = self as? PageBehaviorHandlerProtocol else { return }
|
||||||
behaviorHandler.createBehaviors(for: model, delegateObject: delegateObjectIVar)
|
behaviorHandlerModel.traverseAndAddRequiredBehaviors()
|
||||||
|
behaviorHandler.createBehaviors(for: behaviorHandlerModel, delegateObject: delegateObject)
|
||||||
}
|
}
|
||||||
|
|
||||||
func decodeTemplate(using decoder: JSONDecoder, from data: Data) throws -> TemplateModel {
|
func decodeTemplate(using decoder: JSONDecoder, from data: Data) throws -> TemplateModel {
|
||||||
try decoder.decode(TemplateModel.self, from: data)
|
try decoder.decode(TemplateModel.self, from: data)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Traverses all models and adds any required behavior models.
|
|
||||||
func traverseAndAddRequiredBehaviors() {
|
|
||||||
guard var model = model else { return }
|
|
||||||
let behaviorModels: [PageBehaviorModelProtocol] = model.reduceDepthFirstTraverse(options: .childFirst, depth: 0, initialResult: []) { (accumulator, molecule, depth) in
|
|
||||||
if let behaviorRequirer = molecule as? PageBehaviorProtocolRequirer {
|
|
||||||
return accumulator + behaviorRequirer.getRequiredBehaviors()
|
|
||||||
}
|
|
||||||
return accumulator
|
|
||||||
}
|
|
||||||
for behavior in behaviorModels {
|
|
||||||
model.add(behavior: behavior)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user