[0.1.0] Example Model

This commit is contained in:
Shial 2017-12-12 21:45:30 +11:00
parent 4a1539e51b
commit eafdba24f6
4 changed files with 290 additions and 82 deletions

View File

@ -1,8 +1,26 @@
# SLazeKit
SLazeKit
<p align="center">
<a href="http://swift.org">
<img src="https://img.shields.io/badge/Swift-4.0-brightgreen.svg" alt="Language" />
</a>
<a href="https://raw.githubusercontent.com/shial4/SLazeKit/master/LICENSE">
<img src="https://img.shields.io/badge/license-MIT-blue.svg" alt="License" />
</a>
<a href="https://cocoapods.org/pods/SLazeKit">
<img src="https://img.shields.io/cocoapods/v/SLazeKit.svg" alt="CocoaPods" />
</a>
<a href="https://github.com/Carthage/Carthage">
<img src="https://img.shields.io/badge/carthage-compatible-4BC51D.svg?style=flat" alt="Carthage" />
</a>
</p>
## 💊 Usage
SLazeKit is an easy to use Swift restfull collection of extensions and classes. Don't spend hours writing your code to map your rest api request into models and coredata serialization. Stop wasting your time!
**SLazeKit allows you:**
- map your models by `Codable` protocol
- serialize `CoreData` models from API response
- fast and simple extend your models with `API` & `CoreData`
## 🔧 Installation
@ -22,6 +40,46 @@ Clone the repo and drag the folder `SLazeKit` into your Xcode project.
Add the line `.package(url: "https://github.com/shial4/SLazeKit.git", from: "0.1.0"),` to your `Package.swift`
**Swift Package Manager in your iOS Project:**
This project demonstrates a working method for using Swift Package Manager (SPM) to manage the dependencies of an iOS project.
<a href="https://github.com/j-channings/swift-package-manager-ios">Example of how to use SPM v4 to manage iOS dependencies</a>
## 💊 Usage
For positive experience, you should configure `SLazeKit` at first. This step is optional. You may leave it as it is default.
```swift
import SLazeKit
extension SLazeKit {
//Provide base path for your API requests.
open class var basePath?: String { return "www.yourdomain.com" }
//Additional you can set port for your requests.
open class var basePort: Int? { return 8040 }
//You can provide your own instance of JSONDecoder.
open class var decoder: JSONDecoder { return JSONDecoder() }
//You can customize instance of URLSession in here.
open class var urlSession: URLSession { return URLSession.shared }
//If you feel like to set header dor requests do it in here.
open class func setup(_ request: URLRequest) -> URLRequest {
var request: URLRequest = request
request.setValue("Your token", forHTTPHeaderField: "X-Access-Token")
request.setValue("application/json", forHTTPHeaderField: "Content-Type")
return request
}
//If you feel like to monitor response. You can do it in here.
open class func handle(_ response: HTTPURLResponse?) {
if response?.statusCode == 401 {
Client.logout()
}
}
}
```
**Model example**
[Model.swift](Tests/SLazeKitTests/Models/Model.swift)
## ⭐ Contributing
Be welcome to contribute to this project! :)

View File

@ -9,11 +9,11 @@
/* Begin PBXAggregateTarget section */
"SLazeKit::SLazeKitPackageTests::ProductTarget" /* SLazeKitPackageTests */ = {
isa = PBXAggregateTarget;
buildConfigurationList = OBJ_53 /* Build configuration list for PBXAggregateTarget "SLazeKitPackageTests" */;
buildConfigurationList = OBJ_58 /* Build configuration list for PBXAggregateTarget "SLazeKitPackageTests" */;
buildPhases = (
);
dependencies = (
OBJ_56 /* PBXTargetDependency */,
OBJ_61 /* PBXTargetDependency */,
);
name = SLazeKitPackageTests;
productName = SLazeKitPackageTests;
@ -21,28 +21,29 @@
/* End PBXAggregateTarget section */
/* Begin PBXBuildFile section */
625513671FDFD27F00CFF484 /* StringInitializableTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 625513661FDFD27F00CFF484 /* StringInitializableTests.swift */; };
OBJ_29 /* Package.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_6 /* Package.swift */; };
OBJ_35 /* SLazeKitTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_20 /* SLazeKitTests.swift */; };
OBJ_37 /* SLazeKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = "SLazeKit::SLazeKit::Product" /* SLazeKit.framework */; };
OBJ_44 /* Decodable.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_10 /* Decodable.swift */; };
OBJ_45 /* NSManagedObject.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_11 /* NSManagedObject.swift */; };
OBJ_46 /* NSManagedObjectContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_12 /* NSManagedObjectContext.swift */; };
OBJ_47 /* String.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_13 /* String.swift */; };
OBJ_48 /* EntityMapping.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_15 /* EntityMapping.swift */; };
OBJ_49 /* StringInitializable.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_16 /* StringInitializable.swift */; };
OBJ_50 /* SLazeKit.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_17 /* SLazeKit.swift */; };
OBJ_32 /* Package.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_6 /* Package.swift */; };
OBJ_38 /* Model.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_21 /* Model.swift */; };
OBJ_39 /* SLazeKitTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_22 /* SLazeKitTests.swift */; };
OBJ_40 /* StringInitializableTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_23 /* StringInitializableTests.swift */; };
OBJ_42 /* SLazeKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = "SLazeKit::SLazeKit::Product" /* SLazeKit.framework */; };
OBJ_49 /* Decodable.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_10 /* Decodable.swift */; };
OBJ_50 /* NSManagedObject.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_11 /* NSManagedObject.swift */; };
OBJ_51 /* NSManagedObjectContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_12 /* NSManagedObjectContext.swift */; };
OBJ_52 /* String.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_13 /* String.swift */; };
OBJ_53 /* EntityMapping.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_15 /* EntityMapping.swift */; };
OBJ_54 /* StringInitializable.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_16 /* StringInitializable.swift */; };
OBJ_55 /* SLazeKit.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_17 /* SLazeKit.swift */; };
/* End PBXBuildFile section */
/* Begin PBXContainerItemProxy section */
625513641FDFD0C000CFF484 /* PBXContainerItemProxy */ = {
629A48071FDFE0D4002DAD03 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = OBJ_1 /* Project object */;
proxyType = 1;
remoteGlobalIDString = "SLazeKit::SLazeKit";
remoteInfo = SLazeKit;
};
625513651FDFD0C000CFF484 /* PBXContainerItemProxy */ = {
629A48081FDFE0D4002DAD03 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = OBJ_1 /* Project object */;
proxyType = 1;
@ -52,7 +53,6 @@
/* End PBXContainerItemProxy section */
/* Begin PBXFileReference section */
625513661FDFD27F00CFF484 /* StringInitializableTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StringInitializableTests.swift; sourceTree = "<group>"; };
OBJ_10 /* Decodable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Decodable.swift; sourceTree = "<group>"; };
OBJ_11 /* NSManagedObject.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NSManagedObject.swift; sourceTree = "<group>"; };
OBJ_12 /* NSManagedObjectContext.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NSManagedObjectContext.swift; sourceTree = "<group>"; };
@ -60,22 +60,24 @@
OBJ_15 /* EntityMapping.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EntityMapping.swift; sourceTree = "<group>"; };
OBJ_16 /* StringInitializable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StringInitializable.swift; sourceTree = "<group>"; };
OBJ_17 /* SLazeKit.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SLazeKit.swift; sourceTree = "<group>"; };
OBJ_20 /* SLazeKitTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SLazeKitTests.swift; sourceTree = "<group>"; };
OBJ_21 /* Model.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Model.swift; sourceTree = "<group>"; };
OBJ_22 /* SLazeKitTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SLazeKitTests.swift; sourceTree = "<group>"; };
OBJ_23 /* StringInitializableTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StringInitializableTests.swift; sourceTree = "<group>"; };
OBJ_6 /* Package.swift */ = {isa = PBXFileReference; explicitFileType = sourcecode.swift; path = Package.swift; sourceTree = "<group>"; };
"SLazeKit::SLazeKit::Product" /* SLazeKit.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = SLazeKit.framework; sourceTree = BUILT_PRODUCTS_DIR; };
"SLazeKit::SLazeKitTests::Product" /* SLazeKitTests.xctest */ = {isa = PBXFileReference; lastKnownFileType = file; path = SLazeKitTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
OBJ_36 /* Frameworks */ = {
OBJ_41 /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 0;
files = (
OBJ_37 /* SLazeKit.framework in Frameworks */,
OBJ_42 /* SLazeKit.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
OBJ_51 /* Frameworks */ = {
OBJ_56 /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 0;
files = (
@ -105,14 +107,23 @@
OBJ_19 /* SLazeKitTests */ = {
isa = PBXGroup;
children = (
OBJ_20 /* SLazeKitTests.swift */,
625513661FDFD27F00CFF484 /* StringInitializableTests.swift */,
OBJ_20 /* Models */,
OBJ_22 /* SLazeKitTests.swift */,
OBJ_23 /* StringInitializableTests.swift */,
);
name = SLazeKitTests;
path = Tests/SLazeKitTests;
sourceTree = SOURCE_ROOT;
};
OBJ_21 /* Products */ = {
OBJ_20 /* Models */ = {
isa = PBXGroup;
children = (
OBJ_21 /* Model.swift */,
);
path = Models;
sourceTree = "<group>";
};
OBJ_24 /* Products */ = {
isa = PBXGroup;
children = (
"SLazeKit::SLazeKitTests::Product" /* SLazeKitTests.xctest */,
@ -127,7 +138,7 @@
OBJ_6 /* Package.swift */,
OBJ_7 /* Sources */,
OBJ_18 /* Tests */,
OBJ_21 /* Products */,
OBJ_24 /* Products */,
);
name = "";
sourceTree = "<group>";
@ -167,10 +178,10 @@
/* Begin PBXNativeTarget section */
"SLazeKit::SLazeKit" /* SLazeKit */ = {
isa = PBXNativeTarget;
buildConfigurationList = OBJ_40 /* Build configuration list for PBXNativeTarget "SLazeKit" */;
buildConfigurationList = OBJ_45 /* Build configuration list for PBXNativeTarget "SLazeKit" */;
buildPhases = (
OBJ_43 /* Sources */,
OBJ_51 /* Frameworks */,
OBJ_48 /* Sources */,
OBJ_56 /* Frameworks */,
);
buildRules = (
);
@ -183,15 +194,15 @@
};
"SLazeKit::SLazeKitTests" /* SLazeKitTests */ = {
isa = PBXNativeTarget;
buildConfigurationList = OBJ_31 /* Build configuration list for PBXNativeTarget "SLazeKitTests" */;
buildConfigurationList = OBJ_34 /* Build configuration list for PBXNativeTarget "SLazeKitTests" */;
buildPhases = (
OBJ_34 /* Sources */,
OBJ_36 /* Frameworks */,
OBJ_37 /* Sources */,
OBJ_41 /* Frameworks */,
);
buildRules = (
);
dependencies = (
OBJ_38 /* PBXTargetDependency */,
OBJ_43 /* PBXTargetDependency */,
);
name = SLazeKitTests;
productName = SLazeKitTests;
@ -200,9 +211,9 @@
};
"SLazeKit::SwiftPMPackageDescription" /* SLazeKitPackageDescription */ = {
isa = PBXNativeTarget;
buildConfigurationList = OBJ_25 /* Build configuration list for PBXNativeTarget "SLazeKitPackageDescription" */;
buildConfigurationList = OBJ_28 /* Build configuration list for PBXNativeTarget "SLazeKitPackageDescription" */;
buildPhases = (
OBJ_28 /* Sources */,
OBJ_31 /* Sources */,
);
buildRules = (
);
@ -228,7 +239,7 @@
en,
);
mainGroup = OBJ_5 /* */;
productRefGroup = OBJ_21 /* Products */;
productRefGroup = OBJ_24 /* Products */;
projectDirPath = "";
projectRoot = "";
targets = (
@ -241,54 +252,55 @@
/* End PBXProject section */
/* Begin PBXSourcesBuildPhase section */
OBJ_28 /* Sources */ = {
OBJ_31 /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 0;
files = (
OBJ_29 /* Package.swift in Sources */,
OBJ_32 /* Package.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
OBJ_34 /* Sources */ = {
OBJ_37 /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 0;
files = (
625513671FDFD27F00CFF484 /* StringInitializableTests.swift in Sources */,
OBJ_35 /* SLazeKitTests.swift in Sources */,
OBJ_38 /* Model.swift in Sources */,
OBJ_39 /* SLazeKitTests.swift in Sources */,
OBJ_40 /* StringInitializableTests.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
OBJ_43 /* Sources */ = {
OBJ_48 /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 0;
files = (
OBJ_44 /* Decodable.swift in Sources */,
OBJ_45 /* NSManagedObject.swift in Sources */,
OBJ_46 /* NSManagedObjectContext.swift in Sources */,
OBJ_47 /* String.swift in Sources */,
OBJ_48 /* EntityMapping.swift in Sources */,
OBJ_49 /* StringInitializable.swift in Sources */,
OBJ_50 /* SLazeKit.swift in Sources */,
OBJ_49 /* Decodable.swift in Sources */,
OBJ_50 /* NSManagedObject.swift in Sources */,
OBJ_51 /* NSManagedObjectContext.swift in Sources */,
OBJ_52 /* String.swift in Sources */,
OBJ_53 /* EntityMapping.swift in Sources */,
OBJ_54 /* StringInitializable.swift in Sources */,
OBJ_55 /* SLazeKit.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXSourcesBuildPhase section */
/* Begin PBXTargetDependency section */
OBJ_38 /* PBXTargetDependency */ = {
OBJ_43 /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
target = "SLazeKit::SLazeKit" /* SLazeKit */;
targetProxy = 625513641FDFD0C000CFF484 /* PBXContainerItemProxy */;
targetProxy = 629A48071FDFE0D4002DAD03 /* PBXContainerItemProxy */;
};
OBJ_56 /* PBXTargetDependency */ = {
OBJ_61 /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
target = "SLazeKit::SLazeKitTests" /* SLazeKitTests */;
targetProxy = 625513651FDFD0C000CFF484 /* PBXContainerItemProxy */;
targetProxy = 629A48081FDFE0D4002DAD03 /* PBXContainerItemProxy */;
};
/* End PBXTargetDependency section */
/* Begin XCBuildConfiguration section */
OBJ_26 /* Debug */ = {
OBJ_29 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
LD = /usr/bin/true;
@ -297,15 +309,6 @@
};
name = Debug;
};
OBJ_27 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
LD = /usr/bin/true;
OTHER_SWIFT_FLAGS = "-swift-version 4 -I /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift/pm/4 -target x86_64-apple-macosx10.10 -sdk /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.sdk";
SWIFT_VERSION = 4.0;
};
name = Release;
};
OBJ_3 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
@ -328,7 +331,16 @@
};
name = Debug;
};
OBJ_32 /* Debug */ = {
OBJ_30 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
LD = /usr/bin/true;
OTHER_SWIFT_FLAGS = "-swift-version 4 -I /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift/pm/4 -target x86_64-apple-macosx10.10 -sdk /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.sdk";
SWIFT_VERSION = 4.0;
};
name = Release;
};
OBJ_35 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
EMBEDDED_CONTENT_CONTAINS_SWIFT = YES;
@ -346,7 +358,7 @@
};
name = Debug;
};
OBJ_33 /* Release */ = {
OBJ_36 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
EMBEDDED_CONTENT_CONTAINS_SWIFT = YES;
@ -384,7 +396,7 @@
};
name = Release;
};
OBJ_41 /* Debug */ = {
OBJ_46 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
ENABLE_TESTABILITY = YES;
@ -406,7 +418,7 @@
};
name = Debug;
};
OBJ_42 /* Release */ = {
OBJ_47 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
ENABLE_TESTABILITY = YES;
@ -428,13 +440,13 @@
};
name = Release;
};
OBJ_54 /* Debug */ = {
OBJ_59 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
};
name = Debug;
};
OBJ_55 /* Release */ = {
OBJ_60 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
};
@ -452,38 +464,38 @@
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Debug;
};
OBJ_25 /* Build configuration list for PBXNativeTarget "SLazeKitPackageDescription" */ = {
OBJ_28 /* Build configuration list for PBXNativeTarget "SLazeKitPackageDescription" */ = {
isa = XCConfigurationList;
buildConfigurations = (
OBJ_26 /* Debug */,
OBJ_27 /* Release */,
OBJ_29 /* Debug */,
OBJ_30 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Debug;
};
OBJ_31 /* Build configuration list for PBXNativeTarget "SLazeKitTests" */ = {
OBJ_34 /* Build configuration list for PBXNativeTarget "SLazeKitTests" */ = {
isa = XCConfigurationList;
buildConfigurations = (
OBJ_32 /* Debug */,
OBJ_33 /* Release */,
OBJ_35 /* Debug */,
OBJ_36 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Debug;
};
OBJ_40 /* Build configuration list for PBXNativeTarget "SLazeKit" */ = {
OBJ_45 /* Build configuration list for PBXNativeTarget "SLazeKit" */ = {
isa = XCConfigurationList;
buildConfigurations = (
OBJ_41 /* Debug */,
OBJ_42 /* Release */,
OBJ_46 /* Debug */,
OBJ_47 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Debug;
};
OBJ_53 /* Build configuration list for PBXAggregateTarget "SLazeKitPackageTests" */ = {
OBJ_58 /* Build configuration list for PBXAggregateTarget "SLazeKitPackageTests" */ = {
isa = XCConfigurationList;
buildConfigurations = (
OBJ_54 /* Debug */,
OBJ_55 /* Release */,
OBJ_59 /* Debug */,
OBJ_60 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Debug;

View File

@ -36,7 +36,7 @@ extension EntityMapping {
}
extension Array where Element: EntityMapping {
func serialized<T: NSManagedObject>(_ context: NSManagedObjectContext?) throws -> [T] {
public func serialized<T: NSManagedObject>(_ context: NSManagedObjectContext?) throws -> [T] {
return try flatMap({ try $0.serialized(context) })
}
}

View File

@ -0,0 +1,138 @@
import Foundation
import SLazeKit
import CoreData
//First we gonna create NSManagedObject object on which we will work.
/// We assume you have Model as an NSManagedObject
class Model: NSManagedObject {}
// MARK: - Simulate extension for CoreData
extension Model {
@nonobjc public class func fetchRequest() -> NSFetchRequest<Model> {
return NSFetchRequest<Model>(entityName: "Model")
}
@NSManaged public var id: String
@NSManaged public var value: Double
@NSManaged public var name: String?
}
// MARK: - SLazeKit extension
extension Model {
/// Path pattern for our model API requests
public struct PathPattern {
static var model: String { return "/api/Models/:modelId" }
static var models: String { return "/api/Models" }
static var create: String { return "/api/Models/:modelId/create" }
static var delete: String { return "/api/Models/:modelId/delete" }
}
/// We are creating struct which represents Decodable response of API request
/// `EntityMappingDecodable` is required
public struct ModelResponse: EntityMappingDecodable {
var id: String
var value: Double
var name: String?
/// We need provide NSManagedObject type for our serialization.
public static var entityType: NSManagedObject.Type {
return Model.self
}
/// By providing id attributes our model are updated/created/serialized
public var idAttributes: [EntityAttribute]? {
return [
("id",id)
]
}
/// Fill CoreData object with our model response
public func fillObject(with model: NSManagedObject) {
guard let object = model as? Model else { return }
object.id = id
object.value = value
object.name = name
}
}
/// We could skip that and add `Encodable` to our ModelResponse. But to highlight it. We will create separate one for request purpose
public struct ModelRequest: Encodable {
var id: String
var value: Double
var name: String?
//Convenience initializer.
init(with model: Model) {
self.id = model.id
self.value = model.value
self.name = model.name
}
}
}
extension Model {
/// Create request. Called from SLazeKit. Response is not maped or serialized.
///
/// - Parameters:
/// - model: CoreData model used to post request with body of ModelRequest
class func create(model: Model, success: @escaping (() ->()), failure: ((_ statusCode: Int, _ error: Error?) ->())? = nil) {
/// SLazeKit request are done i background. To handle response on main thread we need to dispatch it.
let _ = SLazeKit.post(path: PathPattern.create.patternToPath(with: ["modelId":model.id]), body: ModelRequest(with: model)) { (response, error) in
guard error == nil else {
DispatchQueue.main.async { failure?(response?.statusCode ?? -1,error) }
return
}
DispatchQueue.main.async { success() }
}
}
/// Another request example with out mapping or serialization.
///
/// - Parameters:
/// - modelId: model id used to replace key string in path pattern.
class func remove(for modelId: String, success: @escaping (() ->()), failure: ((_ statusCode: Int, _ error: Error?) ->())? = nil) {
/// SLazeKit request are done i background. To handle response on main thread we need to dispatch it.
let _ = SLazeKit.delete(path: PathPattern.delete.patternToPath(with: ["modelId":modelId])) { (response, error) in
guard error == nil else {
DispatchQueue.main.async { failure?(response?.statusCode ?? -1,error) }
return
}
DispatchQueue.main.async { success() }
}
}
/// `[ModelResponse]` Stands as a result type. Decodable provides generic requests. if Response model beside `Decodable` comforms to `EntityMapping` as well it will be serialized.
class func getFromServer(success: @escaping (([Model]?) ->()), failure: (() ->())? = nil) {
/// [ModelResponse] Decodable type used to generate result type.
let _ = [ModelResponse].get(path: PathPattern.models.patternToPath()) { (response, result, error) in
guard error == nil else {
failure?()
return
}
var models: [Model]? = nil
do {
//Result is type of `[ModelResponse]` to return array of our CoreData models we need to serialize it.
//result?.serialized will return `[Model]`
models = try result?.serialized(ModelResponse.persistentContainer?.newBackgroundContext())
} catch {
print(error)
}
success(models)
}
}
class func getFromServer(for modelId: String, success: @escaping ((Model?) ->()), failure: (() ->())? = nil) {
/// in this example API request will decode single object of type ModelResponse instead of an array.
let _ = ModelResponse.get(path: PathPattern.model.patternToPath(with: ["modelId":modelId])) { (response, result, error) in
guard error == nil else {
failure?()
return
}
var models: Model? = nil
do {
//Result of type `ModelResponse` to return CoreData model we need to serialize it.
//result?.serialized will return `Model`
models = try result?.serialized(ModelResponse.persistentContainer?.newBackgroundContext())
} catch {
print(error)
}
success(models)
}
}
}