87 lines
2.1 KiB
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)
|
|
}
|
|
}
|