// // VehiclesArchive.swift // AutoCatCore // // Created by Selim Mustafaev on 19.01.2025. // Copyright © 2025 Selim Mustafaev. All rights reserved. // import SwiftUI public enum VehiclesArchiveError: LocalizedError { case filedCreateCsv public var errorDescription: String? { switch self { case .filedCreateCsv: "Failed to create csv data for vehicles" } } } public final class VehiclesArchive { var vehicles: [VehicleDto] let apiService: ApiServiceProtocol? let filter: Filter? public init(vehiles: [VehicleDto]) { self.vehicles = vehiles self.apiService = nil self.filter = nil } public init(apiService: ApiServiceProtocol, filter: Filter) { self.apiService = apiService self.filter = filter self.vehicles = [] } func makeCsvString() throws -> String { var result = "" let newLine: Character = "\r\n" result.append(VehicleDto.csvHeader) result.append(newLine) for vehicle in vehicles { result.append(vehicle.csvLine) result.append(newLine) } return result } func loadVehiclesIfNeeded() async throws { if let apiService, let filter { let result = try await apiService.getVehicles(with: filter, pageToken: nil, pageSize: 0) vehicles = result.items } } } extension VehiclesArchive: Transferable { public static var fileName: String { "autocat.csv" } public static var transferRepresentation: some TransferRepresentation { DataRepresentation(exportedContentType: .commaSeparatedText) { archive in try await archive.loadVehiclesIfNeeded() let csvString = try archive.makeCsvString() if let data = csvString.data(using: .utf8){ return data } else { throw VehiclesArchiveError.filedCreateCsv } } .suggestedFileName(fileName) } }