This commit is contained in:
65
Sources/ConfigurationClient/File.swift
Normal file
65
Sources/ConfigurationClient/File.swift
Normal file
@@ -0,0 +1,65 @@
|
||||
import FileClient
|
||||
import Foundation
|
||||
|
||||
/// Represents a file location and type on disk for a configuration file.
|
||||
///
|
||||
/// Currently the supported formats are `json` or `toml`. Toml is the default /
|
||||
/// preferred format because it allows comments in the file and is easy to understand.
|
||||
///
|
||||
public enum File: Equatable, Sendable {
|
||||
|
||||
case json(URL)
|
||||
case toml(URL)
|
||||
|
||||
/// Attempts to create a file with the given url.
|
||||
///
|
||||
/// ## NOTE: There are no checks on if a file / path actually exists or not.
|
||||
///
|
||||
/// If the file does not have a suffix of `json` or `toml` then
|
||||
/// we will return `nil`.
|
||||
public init?(_ url: URL) {
|
||||
if url.cleanFilePath.hasSuffix("json") {
|
||||
self = .json(url)
|
||||
} else if url.cleanFilePath.hasSuffix("toml") {
|
||||
self = .toml(url)
|
||||
} else {
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
||||
/// Attempts to create a file with the given path.
|
||||
///
|
||||
/// ## NOTE: There are no checks on if a file / path actually exists or not.
|
||||
///
|
||||
/// If the file does not have a suffix of `json` or `toml` then
|
||||
/// we will return `nil`.
|
||||
public init?(_ path: String) {
|
||||
self.init(URL(filePath: path))
|
||||
}
|
||||
|
||||
/// Get the url of the file.
|
||||
public var url: URL {
|
||||
switch self {
|
||||
case let .json(url): return url
|
||||
case let .toml(url): return url
|
||||
}
|
||||
}
|
||||
|
||||
/// Get the path string of the file.
|
||||
public var path: String {
|
||||
url.cleanFilePath
|
||||
}
|
||||
|
||||
/// Represents the default file path for a user's configuration.
|
||||
///
|
||||
/// Which is `~/.config/hpa/config.toml`
|
||||
public static var `default`: Self {
|
||||
let fileUrl = FileManager.default
|
||||
.homeDirectoryForCurrentUser
|
||||
.appending(path: ".config")
|
||||
.appending(path: HPAKey.configDirName)
|
||||
.appending(path: HPAKey.defaultFileName)
|
||||
|
||||
return .toml(fileUrl)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user