import Dependencies import DependenciesMacros import ManualDCore import Parsing extension DependencyValues { public var csvParser: CSVParser { get { self[CSVParser.self] } set { self[CSVParser.self] = newValue } } } @DependencyClient public struct CSVParser: Sendable { public var parseRooms: @Sendable (Room.CSV) async throws -> [Room.CSV.Row] } extension CSVParser: DependencyKey { public static let testValue = Self() public static let liveValue = Self( parseRooms: { csv in guard let string = String(data: csv.file, encoding: .utf8) else { throw CSVParsingError("Unreadable file data") } let rows = try RoomCSVParser().parse(string[...].utf8) return rows.reduce(into: [Room.CSV.Row]()) { if case .room(let room) = $1 { $0.append(room) } } } ) } public struct CSVParsingError: Error { let reason: String public init(_ reason: String) { self.reason = reason } }