-
Notifications
You must be signed in to change notification settings - Fork 23
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #5 from ialimz/save-modifiers-on-disk
Persist modifiers on disk
- Loading branch information
Showing
6 changed files
with
144 additions
and
11 deletions.
There are no files selected for viewing
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
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
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
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,105 @@ | ||
// | ||
// PersistHelper.swift | ||
// | ||
// | ||
// Created by Ali Moazenzadeh on 9/23/21. | ||
// | ||
|
||
import Foundation | ||
|
||
public class PersistHelper { | ||
|
||
fileprivate init() { } | ||
|
||
/// Returns URL constructed from specified directory | ||
static fileprivate func getURL() -> URL { | ||
let searchPathDirectory: FileManager.SearchPathDirectory = .documentDirectory | ||
|
||
if let url = FileManager.default.urls(for: searchPathDirectory, in: .userDomainMask).first { | ||
return url | ||
} else { | ||
fatalError("Could not create URL for specified directory!") | ||
} | ||
} | ||
|
||
|
||
/// Store an encodable struct to the specified directory on disk | ||
/// | ||
/// - Parameters: | ||
/// - object: the encodable struct to store | ||
/// - directory: where to store the struct | ||
/// - fileName: what to name the file where the struct data will be stored | ||
static func store<T: Encodable>(_ object: T, as fileName: String) { | ||
let url = getURL().appendingPathComponent(fileName, isDirectory: false) | ||
|
||
let encoder = JSONEncoder() | ||
do { | ||
let data = try encoder.encode(object) | ||
if FileManager.default.fileExists(atPath: url.path) { | ||
try FileManager.default.removeItem(at: url) | ||
} | ||
FileManager.default.createFile(atPath: url.path, contents: data, attributes: nil) | ||
} catch { | ||
fatalError(error.localizedDescription) | ||
} | ||
} | ||
|
||
/// Retrieve and convert a struct from a file on disk | ||
/// | ||
/// - Parameters: | ||
/// - fileName: name of the file where struct data is stored | ||
/// - directory: directory where struct data is stored | ||
/// - type: struct type (i.e. Message.self) | ||
/// - Returns: decoded struct model(s) of data | ||
static func retrieve<T: Decodable>(_ fileName: String, as type: T.Type) -> T? { | ||
let url = getURL().appendingPathComponent(fileName, isDirectory: false) | ||
|
||
if !FileManager.default.fileExists(atPath: url.path) { | ||
return nil | ||
} | ||
|
||
if let data = FileManager.default.contents(atPath: url.path) { | ||
let decoder = JSONDecoder() | ||
do { | ||
let model = try decoder.decode(type, from: data) | ||
return model | ||
} catch { | ||
fatalError(error.localizedDescription) | ||
} | ||
} else { | ||
fatalError("No data at \(url.path)!") | ||
} | ||
} | ||
|
||
/// Remove all files at specified directory | ||
static func clear() { | ||
let url = getURL() | ||
do { | ||
let contents = try FileManager.default.contentsOfDirectory(at: url, includingPropertiesForKeys: nil, options: []) | ||
for fileUrl in contents { | ||
try FileManager.default.removeItem(at: fileUrl) | ||
} | ||
} catch { | ||
fatalError(error.localizedDescription) | ||
} | ||
} | ||
|
||
/// Remove specified file from specified directory | ||
static func remove(_ fileName: String) { | ||
let url = getURL().appendingPathComponent(fileName, isDirectory: false) | ||
if FileManager.default.fileExists(atPath: url.path) { | ||
do { | ||
try FileManager.default.removeItem(at: url) | ||
} catch { | ||
fatalError(error.localizedDescription) | ||
} | ||
} | ||
} | ||
|
||
/// Returns BOOL indicating whether file exists at specified directory with specified file name | ||
static func fileExists(_ fileName: String) -> Bool { | ||
let url = getURL().appendingPathComponent(fileName, isDirectory: false) | ||
return FileManager.default.fileExists(atPath: url.path) | ||
} | ||
} | ||
|
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
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
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