cleanup Config
This commit is contained in:
@@ -0,0 +1,56 @@
|
|||||||
|
import Foundation
|
||||||
|
import TOML
|
||||||
|
|
||||||
|
extension PHConfig {
|
||||||
|
/// Load configuration from the default path (~/.config/phbar/config.toml).
|
||||||
|
/// If the file doesn't exist or fails to parse, defaults are used (non-fatal).
|
||||||
|
static func load() throws -> PHConfig {
|
||||||
|
let url = FileManager.default.homeDirectoryForCurrentUser.appending(
|
||||||
|
path: ".config/phbar/config.toml"
|
||||||
|
)
|
||||||
|
|
||||||
|
if FileManager.default.fileExists(atPath: url.relativePath) {
|
||||||
|
return try load(from: url)
|
||||||
|
} else {
|
||||||
|
return try loadFromBundle()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Load the bundled configuration.
|
||||||
|
/// If the file doesn't exist or fails to parse, the execution is interrupted.
|
||||||
|
static private func loadFromBundle() throws -> PHConfig {
|
||||||
|
guard
|
||||||
|
let defaultConfig = Bundle.module.url(
|
||||||
|
forResource: "config",
|
||||||
|
withExtension: "toml"
|
||||||
|
)?.resolvingSymlinksInPath()
|
||||||
|
else {
|
||||||
|
throw phbar.Error("Failed to load config file")
|
||||||
|
}
|
||||||
|
return try load(from: defaultConfig)
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Decode configuration from a file at URL.
|
||||||
|
/// If the file doesn't exist or fails to parse, the execution is interrupted.
|
||||||
|
static private func load(from url: URL) throws -> PHConfig {
|
||||||
|
guard let data = try? Data(contentsOf: url),
|
||||||
|
let contents = String(data: data, encoding: .utf8)
|
||||||
|
else {
|
||||||
|
throw phbar.Error("Failed to load config file")
|
||||||
|
}
|
||||||
|
|
||||||
|
return try load(from: contents)
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Decode configuration from a TOML string.
|
||||||
|
/// If the content fails to parse, the execution is interrupted.
|
||||||
|
static private func load(from contents: String) throws -> PHConfig {
|
||||||
|
do {
|
||||||
|
let decoder = TOMLDecoder()
|
||||||
|
let configFile = try decoder.decode(PHConfig.self, from: contents)
|
||||||
|
return configFile
|
||||||
|
} catch {
|
||||||
|
throw phbar.Error("Failed to parse config file", underlyingError: error)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,62 +1,3 @@
|
|||||||
import Foundation
|
|
||||||
import TOML
|
|
||||||
|
|
||||||
struct PHConfig: Decodable {
|
struct PHConfig: Decodable {
|
||||||
let text: PHConfigText
|
let text: PHConfigText
|
||||||
}
|
}
|
||||||
|
|
||||||
// Loading
|
|
||||||
|
|
||||||
extension PHConfig {
|
|
||||||
/// Load configuration from the default path (~/.config/phbar/config.toml).
|
|
||||||
/// If the file doesn't exist or fails to parse, defaults are used (non-fatal).
|
|
||||||
static func load() throws -> PHConfig {
|
|
||||||
let url = FileManager.default.homeDirectoryForCurrentUser.appending(
|
|
||||||
path: ".config/phbar/config.toml"
|
|
||||||
)
|
|
||||||
|
|
||||||
if FileManager.default.fileExists(atPath: url.relativePath) {
|
|
||||||
return try load(from: url)
|
|
||||||
} else {
|
|
||||||
return try loadFromBundle()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Load the bundled configuration.
|
|
||||||
/// If the file doesn't exist or fails to parse, the execution is interrupted.
|
|
||||||
static private func loadFromBundle() throws -> PHConfig {
|
|
||||||
guard
|
|
||||||
let defaultConfig = Bundle.module.url(
|
|
||||||
forResource: "config",
|
|
||||||
withExtension: "toml"
|
|
||||||
)?.resolvingSymlinksInPath()
|
|
||||||
else {
|
|
||||||
throw phbar.Error("Failed to load config file")
|
|
||||||
}
|
|
||||||
return try load(from: defaultConfig)
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Decode configuration from a file at URL.
|
|
||||||
/// If the file doesn't exist or fails to parse, the execution is interrupted.
|
|
||||||
static private func load(from url: URL) throws -> PHConfig {
|
|
||||||
guard let data = try? Data(contentsOf: url),
|
|
||||||
let contents = String(data: data, encoding: .utf8)
|
|
||||||
else {
|
|
||||||
throw phbar.Error("Failed to load config file")
|
|
||||||
}
|
|
||||||
|
|
||||||
return try load(from: contents)
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Decode configuration from a TOML string.
|
|
||||||
/// If the content fails to parse, the execution is interrupted.
|
|
||||||
static private func load(from contents: String) throws -> PHConfig {
|
|
||||||
do {
|
|
||||||
let decoder = TOMLDecoder()
|
|
||||||
let configFile = try decoder.decode(PHConfig.self, from: contents)
|
|
||||||
return configFile
|
|
||||||
} catch {
|
|
||||||
throw phbar.Error("Failed to parse config file", underlyingError: error)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ struct PHConfigText: Decodable {
|
|||||||
let style: PHConfigTextStyle
|
let style: PHConfigTextStyle
|
||||||
let offset: Double?
|
let offset: Double?
|
||||||
|
|
||||||
enum CodingKeys: String, CodingKey {
|
private enum CodingKeys: String, CodingKey {
|
||||||
case fontFamily = "font"
|
case fontFamily = "font"
|
||||||
case size, weight, style, offset
|
case size, weight, style, offset
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user