AutoCat/AutoCatCore/Models/VehiclesArchive.swift

87 lines
2.1 KiB
Swift

//
// 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)
}
}