-
Notifications
You must be signed in to change notification settings - Fork 11
/
FixtureLoading.swift
44 lines (35 loc) · 1.18 KB
/
FixtureLoading.swift
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
//
// FixtureLoading.swift
//
//
// Created by Joel Klabo on 5/24/23.
//
import Foundation
enum FixtureLoadingError: Error {
case missingFile
case decodingError
}
protocol FixtureLoading {}
extension FixtureLoading {
func loadFixtureData(_ filename: String) throws -> Data {
// Construct the URL for the fixtures directory.
let bundle = Bundle.module
guard let url = bundle.url(forResource: filename, withExtension: "json", subdirectory: "Fixtures") else {
throw FixtureLoadingError.missingFile
}
// Load the data from the file.
return try Data(contentsOf: url)
}
func loadFixtureString(_ filename: String) throws -> String? {
let data = try loadFixtureData(filename)
guard let originalString = String(data: data, encoding: .utf8) else {
throw FixtureLoadingError.decodingError
}
let trimmedString = originalString.filter { !"\n\t\r".contains($0) }
return trimmedString
}
func decodeFixture<T: Decodable>(filename: String) throws -> T {
let data = try loadFixtureData(filename)
return try JSONDecoder().decode(T.self, from: data)
}
}