AutoCat/AutoCatCore/Models/VehiclesArchive.swift

100 lines
2.5 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
}
}
func makeCsvData() async throws -> Data {
try await loadVehiclesIfNeeded()
let csvString = try makeCsvString()
if let data = csvString.data(using: .utf8){
return data
} else {
throw VehiclesArchiveError.filedCreateCsv
}
}
}
extension VehiclesArchive: Transferable {
public static var fileName: String {
"autocat.csv"
}
public static var transferRepresentation: some TransferRepresentation {
DataRepresentation(exportedContentType: .commaSeparatedText) { archive in
try await archive.makeCsvData()
}
.suggestedFileName(fileName)
FileRepresentation(exportedContentType: .commaSeparatedText) { archive in
let data = try await archive.makeCsvData()
let url = FileManager.default.tmpUrl(name: "search", ext: "csv")
try data.write(to: url)
return SentTransferredFile(url, allowAccessingOriginalFile: false)
}
}
}