7
7
8
8
import Foundation
9
9
import Files
10
+ import ScriptToolkit
10
11
11
12
class Exercises {
12
- lazy var mainEntry : Entry = { Entry ( ) } ( )
13
+ lazy var mainEntry : Entry = { Entry ( name: " Root " , isFinal: false ) } ( )
14
+
15
+ // MARK: - Init entries
13
16
14
17
func initialize( ) throws {
15
18
let interestFolder = try Folder ( path: Constants . mainPath) . subfolder ( named: interest)
@@ -21,13 +24,17 @@ class Exercises {
21
24
let exerciseFilePath = folder. path. appendingPathComponent ( path: " exercise.json " )
22
25
23
26
for subfolder in folder. subfolders {
27
+ if subfolder. name == " Ignore " {
28
+ continue
29
+ }
30
+
24
31
try initEntries ( folder: subfolder)
25
32
}
26
33
27
34
let entry = Entry (
28
- id: folder. path ( relativeTo: Constants . mainFolder) ,
29
- items: nil ,
30
35
name: folder. name,
36
+ items: nil ,
37
+ isFinal: false ,
31
38
totalTime: nil ,
32
39
lastPracticeDate: nil ,
33
40
rating: nil ,
@@ -40,12 +47,12 @@ class Exercises {
40
47
41
48
let jsonData = try ! encoder. encode ( entry)
42
49
let jsonString = String ( data: jsonData, encoding: . utf8) !
43
- print ( jsonString)
44
50
45
51
let exerciseFileURL = URL ( fileURLWithPath: exerciseFilePath)
46
52
try jsonString. write ( to: exerciseFileURL, atomically: true , encoding: . utf8)
47
53
}
48
54
55
+ // MARK: - Open entries
49
56
50
57
func openEntries( ) throws {
51
58
let interestFolder = try Folder ( path: Constants . mainPath) . subfolder ( named: interest)
@@ -56,6 +63,10 @@ class Exercises {
56
63
@discardableResult func openEntries( folder: Folder ) throws -> Entry {
57
64
let exerciseFilePath = folder. path. appendingPathComponent ( path: " exercise.json " )
58
65
66
+ guard FileManager . default. locationExists ( path: exerciseFilePath, kind: . file) else {
67
+ throw ScriptError . fileNotFound ( message: exerciseFilePath)
68
+ }
69
+
59
70
let jsonData = try Data ( contentsOf: URL ( fileURLWithPath: exerciseFilePath) )
60
71
var entry = try JSONDecoder ( ) . decode ( Entry . self, from: jsonData)
61
72
@@ -66,15 +77,59 @@ class Exercises {
66
77
67
78
var entries = [ Entry] ( )
68
79
69
- for subfolder in folder. subfolders {
70
- entries. append ( try openEntries ( folder: subfolder) )
80
+ if !entry. isFinal {
81
+ for subfolder in folder. subfolders {
82
+ if subfolder. name == " Ignore " {
83
+ continue
84
+ }
85
+
86
+ entries. append ( try openEntries ( folder: subfolder) )
87
+ }
88
+
89
+ entry. items = entries
71
90
}
72
-
73
- entry. items = entries
74
-
91
+
75
92
return entry
76
93
}
77
94
95
+ // MARK: - Save entries
96
+
97
+ func saveEntries( ) throws {
98
+ let interestFolder = try Folder ( path: Constants . mainPath) . subfolder ( named: interest)
99
+
100
+ try saveEntries ( folder: interestFolder, entry: mainEntry)
101
+ }
102
+
103
+ func saveEntries( folder: Folder , entry: Entry ) throws {
104
+ let exerciseFilePath = folder. path. appendingPathComponent ( path: " exercise.json " )
105
+
106
+ if let unwrappedItems = entry. items {
107
+ for item in unwrappedItems {
108
+ if item. name == " Ignore " {
109
+ continue
110
+ }
111
+
112
+ try saveEntries ( folder: folder. subfolder ( named: item. name) , entry: item)
113
+ }
114
+ }
115
+
116
+ var mutableEntry = entry
117
+ if !mutableEntry. isFinal {
118
+ mutableEntry. items = nil
119
+ }
120
+
121
+ let encoder = JSONEncoder ( )
122
+ encoder. outputFormatting = . prettyPrinted
123
+
124
+ let jsonData = try ! encoder. encode ( mutableEntry)
125
+ let jsonString = String ( data: jsonData, encoding: . utf8) !
126
+
127
+ let exerciseFileURL = URL ( fileURLWithPath: exerciseFilePath)
128
+ try jsonString. write ( to: exerciseFileURL, atomically: true , encoding: . utf8)
129
+ }
130
+ }
131
+
132
+ extension Exercises {
78
133
func openPDF( file: String , page: Int ? ) {
79
134
let scriptSource : String
80
135
0 commit comments