Skip to content

Commit 399ace4

Browse files
committed
Allow to write and read Codable objects for Path/File #50
1 parent 73b86c7 commit 399ace4

File tree

6 files changed

+294
-2
lines changed

6 files changed

+294
-2
lines changed

FileKit.xcodeproj/project.pbxproj

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,14 @@
114114
52BF6BB21B99322000F07E13 /* FileKitError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52BF6BB01B99322000F07E13 /* FileKitError.swift */; };
115115
82F4F2BD1CA95480002C8393 /* FileSystemWatcher.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82F4F2BC1CA95480002C8393 /* FileSystemWatcher.swift */; };
116116
82F4F2C01CA956F2002C8393 /* FileSystemEventStream.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82F4F2BF1CA956F2002C8393 /* FileSystemEventStream.swift */; };
117+
C411910C1F804C8300978BA4 /* JSONType.swift in Sources */ = {isa = PBXBuildFile; fileRef = C41191091F804A6000978BA4 /* JSONType.swift */; };
118+
C411910D1F804C8300978BA4 /* JSONType.swift in Sources */ = {isa = PBXBuildFile; fileRef = C41191091F804A6000978BA4 /* JSONType.swift */; };
119+
C411910E1F804C8300978BA4 /* JSONType.swift in Sources */ = {isa = PBXBuildFile; fileRef = C41191091F804A6000978BA4 /* JSONType.swift */; };
120+
C411910F1F804C8400978BA4 /* JSONType.swift in Sources */ = {isa = PBXBuildFile; fileRef = C41191091F804A6000978BA4 /* JSONType.swift */; };
121+
C41191101F804C8600978BA4 /* PropertyListType.swift in Sources */ = {isa = PBXBuildFile; fileRef = C411910A1F804A6000978BA4 /* PropertyListType.swift */; };
122+
C41191111F804C8600978BA4 /* PropertyListType.swift in Sources */ = {isa = PBXBuildFile; fileRef = C411910A1F804A6000978BA4 /* PropertyListType.swift */; };
123+
C41191131F804C8700978BA4 /* PropertyListType.swift in Sources */ = {isa = PBXBuildFile; fileRef = C411910A1F804A6000978BA4 /* PropertyListType.swift */; };
124+
C41191141F804C8800978BA4 /* PropertyListType.swift in Sources */ = {isa = PBXBuildFile; fileRef = C411910A1F804A6000978BA4 /* PropertyListType.swift */; };
117125
C41FC73A1D9BDCB400C3A0F1 /* Data+FileKit.swift in Sources */ = {isa = PBXBuildFile; fileRef = C41FC7391D9BDCB400C3A0F1 /* Data+FileKit.swift */; };
118126
C41FC73B1D9BDCD100C3A0F1 /* Data+FileKit.swift in Sources */ = {isa = PBXBuildFile; fileRef = C41FC7391D9BDCB400C3A0F1 /* Data+FileKit.swift */; };
119127
C41FC73C1D9BDCD100C3A0F1 /* Data+FileKit.swift in Sources */ = {isa = PBXBuildFile; fileRef = C41FC7391D9BDCB400C3A0F1 /* Data+FileKit.swift */; };
@@ -185,6 +193,8 @@
185193
82F4F2BB1CA94DEC002C8393 /* .swiftlint.yml */ = {isa = PBXFileReference; lastKnownFileType = text; path = .swiftlint.yml; sourceTree = "<group>"; };
186194
82F4F2BC1CA95480002C8393 /* FileSystemWatcher.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FileSystemWatcher.swift; sourceTree = "<group>"; };
187195
82F4F2BF1CA956F2002C8393 /* FileSystemEventStream.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FileSystemEventStream.swift; sourceTree = "<group>"; };
196+
C41191091F804A6000978BA4 /* JSONType.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = JSONType.swift; sourceTree = "<group>"; };
197+
C411910A1F804A6000978BA4 /* PropertyListType.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PropertyListType.swift; sourceTree = "<group>"; };
188198
C41FC7391D9BDCB400C3A0F1 /* Data+FileKit.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Data+FileKit.swift"; sourceTree = "<group>"; };
189199
C41FC73E1D9BE44A00C3A0F1 /* Dictionary+File.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Dictionary+File.swift"; sourceTree = "<group>"; };
190200
C41FC7401D9BE4DB00C3A0F1 /* DataFile.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DataFile.swift; sourceTree = "<group>"; };
@@ -270,9 +280,10 @@
270280
52255DCA1C042D6E00AC1DA5 /* FilePermissions.swift */,
271281
52A016C31C013F3D0045A9C8 /* DirectoryEnumerator.swift */,
272282
523C33981B9B764600AB70E4 /* DataType.swift */,
283+
C411910B1F804A9000978BA4 /* Codable Types */,
284+
52F3AFA71CDFB48600C2BBBD /* File Types */,
273285
52BF6BB01B99322000F07E13 /* FileKitError.swift */,
274286
523C33A61B9B894A00AB70E4 /* Operators.swift */,
275-
52F3AFA71CDFB48600C2BBBD /* File Types */,
276287
52F3AFA61CDFB46300C2BBBD /* Watching */,
277288
52F3AFA51CDFB45100C2BBBD /* Extensions */,
278289
);
@@ -340,6 +351,15 @@
340351
name = "File Types";
341352
sourceTree = "<group>";
342353
};
354+
C411910B1F804A9000978BA4 /* Codable Types */ = {
355+
isa = PBXGroup;
356+
children = (
357+
C41191091F804A6000978BA4 /* JSONType.swift */,
358+
C411910A1F804A6000978BA4 /* PropertyListType.swift */,
359+
);
360+
name = "Codable Types";
361+
sourceTree = "<group>";
362+
};
343363
/* End PBXGroup section */
344364

345365
/* Begin PBXHeadersBuildPhase section */
@@ -634,6 +654,7 @@
634654
82F4F2C01CA956F2002C8393 /* FileSystemEventStream.swift in Sources */,
635655
52A016C41C013F3D0045A9C8 /* DirectoryEnumerator.swift in Sources */,
636656
524D315F1BC7A02A008B93D0 /* Image+FileKit.swift in Sources */,
657+
C411910C1F804C8300978BA4 /* JSONType.swift in Sources */,
637658
C41FC73F1D9BE44A00C3A0F1 /* Dictionary+File.swift in Sources */,
638659
524D315B1BC79331008B93D0 /* NSDataFile.swift in Sources */,
639660
520E0E301C110CA900BAEA99 /* Process+FileKit.swift in Sources */,
@@ -642,6 +663,7 @@
642663
C41FC7411D9BE4DB00C3A0F1 /* DataFile.swift in Sources */,
643664
52A017001C01AD4A0045A9C8 /* NSData+FileKit.swift in Sources */,
644665
52A016F61C01ACE50045A9C8 /* NSDictionary+FileKit.swift in Sources */,
666+
C41191131F804C8700978BA4 /* PropertyListType.swift in Sources */,
645667
C41FC7461D9BEEC000C3A0F1 /* Array+File.swift in Sources */,
646668
52B938C91BF402ED001B7AEB /* ImageFile.swift in Sources */,
647669
17217D5E1CDCD74000723D11 /* DispatchEvent.swift in Sources */,
@@ -673,12 +695,14 @@
673695
524D315C1BC79331008B93D0 /* NSDataFile.swift in Sources */,
674696
52A0170B1C01D5400045A9C8 /* FileType.swift in Sources */,
675697
523C33A81B9B894A00AB70E4 /* Operators.swift in Sources */,
698+
C411910D1F804C8300978BA4 /* JSONType.swift in Sources */,
676699
C41FC74D1D9BF05A00C3A0F1 /* Dictionary+File.swift in Sources */,
677700
C41FC7471D9BEEF300C3A0F1 /* Array+File.swift in Sources */,
678701
52A017111C024D840045A9C8 /* NSString+FileKit.swift in Sources */,
679702
520E0E311C110CA900BAEA99 /* Process+FileKit.swift in Sources */,
680703
523C33791B9A7EFC00AB70E4 /* TextFile.swift in Sources */,
681704
52A017011C01AD4A0045A9C8 /* NSData+FileKit.swift in Sources */,
705+
C41191141F804C8800978BA4 /* PropertyListType.swift in Sources */,
682706
5263A8FD1B96B94D00635A93 /* Path.swift in Sources */,
683707
52A016C51C013F3D0045A9C8 /* DirectoryEnumerator.swift in Sources */,
684708
524D31601BC7A02A008B93D0 /* Image+FileKit.swift in Sources */,
@@ -718,12 +742,14 @@
718742
524D315D1BC79331008B93D0 /* NSDataFile.swift in Sources */,
719743
52A0170C1C01D5400045A9C8 /* FileType.swift in Sources */,
720744
5276124D1BAEA43600503D0A /* DictionaryFile.swift in Sources */,
745+
C411910E1F804C8300978BA4 /* JSONType.swift in Sources */,
721746
C41FC74C1D9BF05A00C3A0F1 /* Dictionary+File.swift in Sources */,
722747
C41FC74A1D9BEEF400C3A0F1 /* Array+File.swift in Sources */,
723748
52A017121C024D840045A9C8 /* NSString+FileKit.swift in Sources */,
724749
520E0E321C110CA900BAEA99 /* Process+FileKit.swift in Sources */,
725750
5276124B1BAEA43600503D0A /* File.swift in Sources */,
726751
52A017021C01AD4A0045A9C8 /* NSData+FileKit.swift in Sources */,
752+
C41191111F804C8600978BA4 /* PropertyListType.swift in Sources */,
727753
5276124C1BAEA43600503D0A /* TextFile.swift in Sources */,
728754
52A016C61C013F3D0045A9C8 /* DirectoryEnumerator.swift in Sources */,
729755
524D31611BC7A02A008B93D0 /* Image+FileKit.swift in Sources */,
@@ -755,12 +781,14 @@
755781
52B938C41BF3C42A001B7AEB /* Operators.swift in Sources */,
756782
52A016F41C0184CA0045A9C8 /* FileProtection.swift in Sources */,
757783
52B938BD1BF3C42A001B7AEB /* TextFile.swift in Sources */,
784+
C411910F1F804C8400978BA4 /* JSONType.swift in Sources */,
758785
C41FC74B1D9BF05A00C3A0F1 /* Dictionary+File.swift in Sources */,
759786
C41FC7491D9BEEF400C3A0F1 /* Array+File.swift in Sources */,
760787
52B938C11BF3C42A001B7AEB /* Path.swift in Sources */,
761788
52A016F91C01ACE50045A9C8 /* NSDictionary+FileKit.swift in Sources */,
762789
52A0170D1C01D5400045A9C8 /* FileType.swift in Sources */,
763790
52B938BE1BF3C42A001B7AEB /* DictionaryFile.swift in Sources */,
791+
C41191101F804C8600978BA4 /* PropertyListType.swift in Sources */,
764792
520E0E331C110CA900BAEA99 /* Process+FileKit.swift in Sources */,
765793
52A017031C01AD4A0045A9C8 /* NSData+FileKit.swift in Sources */,
766794
52A016C71C013F3D0045A9C8 /* DirectoryEnumerator.swift in Sources */,

Sources/FileKit.swift

Lines changed: 51 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ public enum FileKitInfo {
4040
/// The current version.
4141
///
4242
/// FileKit follows [Semantic Versioning v2.0.0](http://semver.org/).
43-
public static let version = "v4.0.1"
43+
public static let version = "v5.0.0"
4444

4545
/// The current release.
4646
public static let release = 12
@@ -55,3 +55,53 @@ public enum FileKitInfo {
5555
public static let projectURL = "https://github.com/nvzqz/FileKit"
5656

5757
}
58+
59+
import Foundation
60+
61+
public struct FileKit {
62+
63+
/// Shared json decoder instance
64+
public static var jsonDecoder = JSONDecoder()
65+
/// Shared json encoder instance
66+
public static var jsonEncoder = JSONEncoder()
67+
/// Shared property list decoder instance
68+
public static var propertyListDecoder = PropertyListDecoder()
69+
/// Shared property list encoder instance
70+
public static var propertyListEncoder = PropertyListEncoder()
71+
72+
}
73+
74+
extension FileKit {
75+
76+
/// Write an `Encodable` object to path
77+
///
78+
/// - Parameter codable: The codable object to write.
79+
/// - Parameter path: The destination path for write operation.
80+
/// - Parameter encoder: A specific JSON encoder (default: FileKit.jsonEncoder).
81+
///
82+
public static func write<T: Encodable>(_ codable: T, to path: Path, with encoder: JSONEncoder = FileKit.jsonEncoder) throws {
83+
do {
84+
let data = try encoder.encode(codable)
85+
try DataFile(path: path).write(data)
86+
} catch let error as FileKitError {
87+
throw error
88+
} catch {
89+
throw FileKitError.writeToFileFail(path: path, error: error)
90+
}
91+
}
92+
93+
/// Read an `Encodable` object from path
94+
///
95+
/// - Parameter path: The destination path for write operation.
96+
/// - Parameter decoder: A specific JSON decoder (default: FileKit.jsonDecoder).
97+
///
98+
public static func read<T: Decodable>(from path: Path, with decoder: JSONDecoder = FileKit.jsonDecoder) throws -> T {
99+
let data = try DataFile(path: path).read()
100+
do {
101+
return try decoder.decode(T.self, from: data)
102+
} catch {
103+
throw FileKitError.readFromFileFail(path: path, error: error)
104+
}
105+
}
106+
107+
}

Sources/ImageFile.swift

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,10 @@
2727

2828
import Foundation
2929

30+
#if os(macOS) || os(iOS) || os(tvOS) || os(watchOS)
3031
/// A representation of a filesystem image file.
3132
///
3233
/// The data type is Image.
3334
public typealias ImageFile = File<Image>
35+
36+
#endif

Sources/JSONType.swift

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
//
2+
// JSONFile.swift
3+
// FileKit
4+
//
5+
// Created by phimage on 30/09/2017.
6+
// Copyright © 2017 Nikolai Vazquez. All rights reserved.
7+
//
8+
9+
import Foundation
10+
11+
// MARK: JSONReadable
12+
13+
/// A JSON readable object is `Decodable`and provide it`s own decoder
14+
public protocol JSONReadable: Readable, Decodable {
15+
static var jsonDecoder: JSONDecoder { get }
16+
}
17+
extension JSONReadable {
18+
// default implementation return the shared one
19+
public static var jsonDecoder: JSONDecoder {
20+
return FileKit.jsonDecoder
21+
}
22+
}
23+
// Implement Readable
24+
extension JSONReadable {
25+
26+
/// Read a Decodable object
27+
public static func read(from path: Path) throws -> Self {
28+
let data = try DataFile(path: path).read()
29+
do {
30+
return try jsonDecoder.decode(self, from: data)
31+
} catch {
32+
throw FileKitError.readFromFileFail(path: path, error: error)
33+
}
34+
}
35+
36+
}
37+
38+
// MARK: JSONWritable
39+
40+
/// A JSON readable object is `Decodable`and provide it`s own decoder
41+
public protocol JSONWritable: Writable, Encodable {
42+
var jsonEncoder: JSONEncoder { get }
43+
}
44+
extension JSONWritable {
45+
// default implementation return the shared one
46+
public var jsonEncoder: JSONEncoder {
47+
return FileKit.jsonEncoder
48+
}
49+
}
50+
// Implement Writable
51+
extension JSONWritable {
52+
53+
public func write(to path: Path, atomically useAuxiliaryFile: Bool) throws {
54+
do {
55+
let data = try jsonEncoder.encode(self)
56+
try DataFile(path: path).write(data, atomically: useAuxiliaryFile)
57+
} catch let error as FileKitError {
58+
throw error
59+
} catch {
60+
throw FileKitError.writeToFileFail(path: path, error: error)
61+
}
62+
}
63+
64+
}

Sources/PropertyListType.swift

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
//
2+
// PropertyListFile.swift
3+
// FileKit
4+
//
5+
// Created by phimage on 30/09/2017.
6+
// Copyright © 2017 Nikolai Vazquez. All rights reserved.
7+
//
8+
9+
import Foundation
10+
11+
// MARK: PropertyListReadable
12+
13+
/// A PropertyList readable object is `Decodable`and provide it`s own decoder
14+
public protocol PropertyListReadable: Readable, Decodable {
15+
static var propertyListDecoder: PropertyListDecoder { get }
16+
}
17+
extension PropertyListReadable {
18+
// default implementation return the shared one
19+
public static var propertyListDecoder: PropertyListDecoder {
20+
return FileKit.propertyListDecoder
21+
}
22+
}
23+
// Implement Readable
24+
extension PropertyListReadable {
25+
26+
/// Read a Decodable object
27+
public static func read(from path: Path) throws -> Self {
28+
let data = try DataFile(path: path).read()
29+
do {
30+
return try propertyListDecoder.decode(self, from: data)
31+
} catch {
32+
throw FileKitError.readFromFileFail(path: path, error: error)
33+
}
34+
}
35+
36+
}
37+
38+
// MARK: PropertyListWritable
39+
40+
/// A PropertyList readable object is `Decodable`and provide it`s own decoder
41+
public protocol PropertyListWritable: Writable, Encodable {
42+
var propertyListEncoder: PropertyListEncoder { get }
43+
}
44+
extension PropertyListWritable {
45+
// default implementation return the shared one
46+
public var propertyListEncoder: PropertyListEncoder {
47+
return FileKit.propertyListEncoder
48+
}
49+
}
50+
// Implement Writable
51+
extension PropertyListWritable {
52+
53+
public func write(to path: Path, atomically useAuxiliaryFile: Bool) throws {
54+
do {
55+
let data = try propertyListEncoder.encode(self)
56+
try DataFile(path: path).write(data, atomically: useAuxiliaryFile)
57+
} catch let error as FileKitError {
58+
throw error
59+
} catch {
60+
throw FileKitError.writeToFileFail(path: path, error: error)
61+
}
62+
}
63+
64+
}

0 commit comments

Comments
 (0)