Skip to content

Commit b6e7e46

Browse files
committed
Support SF Symbols 5, and add new arguments
1 parent b9e7368 commit b6e7e46

File tree

1 file changed

+98
-40
lines changed

1 file changed

+98
-40
lines changed

SFSymbolsGenerator/main.swift

Lines changed: 98 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -7,65 +7,123 @@
77

88
import Foundation
99

10-
func readSymbolsAndYears(from fileURL: URL) -> ([SymbolTuple], Releases) {
11-
let data = try! Data(contentsOf: fileURL, options: .mappedIfSafe)
12-
let propertyList = try! PropertyListSerialization.propertyList(from: data,
13-
options: [],
14-
format: nil) as! Dictionary<String, Any>
10+
enum GenerateError: Error, CustomStringConvertible {
1511

16-
let symbols = propertyList["symbols"] as! Symbols
17-
let releases = propertyList["year_to_release"] as! Releases
12+
case unknown(Error)
1813

19-
let releaseDatesFromSymbols = Set<ReleaseDate>(symbols.values)
20-
let releaseDatesFromReleases = Set<ReleaseDate>(releases.keys)
14+
case notInstallSFSymbols
2115

22-
assert(releaseDatesFromReleases.isSubset(of:releaseDatesFromSymbols),
23-
"There are symbols with releasedates that have no release versions \(releaseDatesFromReleases) < \(releaseDatesFromSymbols)")
16+
case notInstallSFSymbolsBeta
2417

25-
let sortedSymbolTuple = symbols
26-
.sorted {
27-
$0.value == $1.value ? $0.key < $1.key : $0.value < $1.value
28-
}
29-
.map {
30-
SymbolTuple(symbol: $0.key, released: $0.value)
31-
}
18+
case propertyList(Error)
3219

33-
return (sortedSymbolTuple, releases)
20+
var description: String {
21+
switch self {
22+
case .unknown(let error):
23+
"Unknown Error: \(error.localizedDescription)"
24+
case .notInstallSFSymbols:
25+
"SF Symbols.app is not installed yet! Please go to Apple Developer Website to download!"
26+
case .notInstallSFSymbolsBeta:
27+
"SF Symbols beta.app is not installed yet! Please go to Apple Developer Website to download!"
28+
case .propertyList(let error):
29+
"PropertyList Error: \(error.localizedDescription)"
30+
}
31+
}
3432
}
3533

36-
let (sortedSymbolTuple, releaseYears) = readSymbolsAndYears(from: URL(fileURLWithPath: "/Applications/SF Symbols beta.app/Contents/Resources/Metadata/name_availability.plist"))
37-
38-
var outputStream = OutputStreamCapture()
34+
func readSymbolsAndYears(from fileURL: URL) throws -> ([SymbolTuple], Releases) {
35+
do {
36+
let data = try Data(contentsOf: fileURL, options: .mappedIfSafe)
37+
do {
38+
let propertyList = try PropertyListSerialization.propertyList(from: data,
39+
options: [],
40+
format: nil) as! Dictionary<String, Any>
41+
42+
let symbols = propertyList["symbols"] as! Symbols
43+
let releases = propertyList["year_to_release"] as! Releases
44+
45+
let releaseDatesFromSymbols = Set<ReleaseDate>(symbols.values)
46+
let releaseDatesFromReleases = Set<ReleaseDate>(releases.keys)
47+
48+
assert(releaseDatesFromReleases.isSubset(of:releaseDatesFromSymbols),
49+
"There are symbols with releasedates that have no release versions \(releaseDatesFromReleases) < \(releaseDatesFromSymbols)")
50+
51+
let sortedSymbolTuple = symbols
52+
.sorted {
53+
$0.value == $1.value ? $0.key < $1.key : $0.value < $1.value
54+
}
55+
.map {
56+
SymbolTuple(symbol: $0.key, released: $0.value)
57+
}
58+
59+
return (sortedSymbolTuple, releases)
60+
} catch {
61+
throw GenerateError.propertyList(error)
62+
}
63+
} catch {
64+
if fileURL.path().contains("SF%20Symbols.app") {
65+
throw GenerateError.notInstallSFSymbols
66+
} else if fileURL.path().contains("SF%20Symbols%20beta.app") {
67+
throw GenerateError.notInstallSFSymbolsBeta
68+
} else {
69+
throw GenerateError.unknown(error)
70+
}
71+
}
72+
}
3973

40-
outputStream.capturePrint(
74+
do {
75+
var appURL: URL!
76+
for argc in CommandLine.arguments {
77+
switch argc {
78+
case "--use-beta":
79+
appURL = URL(fileURLWithPath: "/Applications/SF Symbols beta.app/Contents/Resources/Metadata/name_availability.plist")
80+
default:
81+
appURL = URL(fileURLWithPath: "/Applications/SF Symbols.app/Contents/Resources/Metadata/name_availability.plist")
82+
}
83+
}
84+
85+
let (sortedSymbolTuple, releaseYears) = try readSymbolsAndYears(from: appURL)
86+
87+
let outputStream = OutputStreamCapture()
88+
89+
outputStream.capturePrint(
4190
"""
4291
import Foundation
4392
4493
public enum SFSymbols: String, CaseIterable {\n
4594
"""
46-
)
47-
48-
for symbolTuple in sortedSymbolTuple {
49-
outputStream.capturePrint(" " + "/// SF Symbols's name:" + symbolTuple.symbol)
50-
outputStream.capturePrint(" @" + releaseYears[symbolTuple.released]!.availabilty + "\n case " + symbolTuple.symbol.replacementName + " = \"" + symbolTuple.symbol + "\"\n" )
51-
}
52-
outputStream.capturePrint(
95+
)
96+
97+
for symbolTuple in sortedSymbolTuple {
98+
outputStream.capturePrint(" " + "/// SF Symbols's name:" + symbolTuple.symbol)
99+
outputStream.capturePrint(" @" + releaseYears[symbolTuple.released]!.availabilty + "\n case " + symbolTuple.symbol.replacementName + " = \"" + symbolTuple.symbol + "\"\n" )
100+
}
101+
outputStream.capturePrint(
53102
"""
54103
public static var allCases: [SFSymbols] {
55104
var allCases: [SFSymbols] = []\n
56105
"""
57-
)
58-
59-
for symbolTuple in sortedSymbolTuple {
60-
outputStream.capturePrint(" if #" + releaseYears[symbolTuple.released]!.availabilty + " {\n allCases.append(SFSymbols." + symbolTuple.symbol.replacementName + ")\n }\n")
61-
}
62-
outputStream.capturePrint(
106+
)
107+
108+
for symbolTuple in sortedSymbolTuple {
109+
outputStream.capturePrint(" if #" + releaseYears[symbolTuple.released]!.availabilty + " {\n allCases.append(SFSymbols." + symbolTuple.symbol.replacementName + ")\n }\n")
110+
}
111+
outputStream.capturePrint(
63112
"""
64113
return allCases
65114
}
66115
}
67116
"""
68-
)
69-
70-
let writer = FileWriter()
71-
writer.write(with: outputStream.capturedOutput)
117+
)
118+
119+
let writer = FileWriter()
120+
writer.write(with: outputStream.capturedOutput)
121+
} catch (let error as GenerateError) {
122+
switch error {
123+
case .unknown(_), .propertyList(_):
124+
print(error.description)
125+
case .notInstallSFSymbols, .notInstallSFSymbolsBeta:
126+
print("Error:\(error.description)")
127+
}
128+
exit(0)
129+
}

0 commit comments

Comments
 (0)