Skip to content

Commit 8042e66

Browse files
committed
~ Finally compiles
1 parent 748b556 commit 8042e66

78 files changed

Lines changed: 319 additions & 196 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

Cork/ContentView.swift

Lines changed: 15 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,12 @@
88
// swiftlint:disable file_length
99

1010
import ButtonKit
11+
import CorkModels
1112
import CorkShared
13+
import CorkTerminalFunctions
1214
import Defaults
15+
import FactoryKit
1316
import SwiftUI
14-
import CorkModels
15-
import CorkTerminalFunctions
1617

1718
struct ContentView: View, Sendable
1819
{
@@ -30,7 +31,7 @@ struct ContentView: View, Sendable
3031

3132
@Environment(\.openWindow) var openWindow: OpenWindowAction
3233

33-
@Environment(AppState.self) var appState: AppState
34+
@InjectedObservable(\.appState) var appState: AppState
3435

3536
@Environment(BrewPackagesTracker.self) var brewPackagesTracker: BrewPackagesTracker
3637
@Environment(TapTracker.self) var tapTracker: TapTracker
@@ -221,7 +222,7 @@ private extension View
221222
if FileManager.default.fileExists(atPath: AppConstants.shared.documentsDirectoryPath.path)
222223
{
223224
AppConstants.shared.logger.info("Documents directory exists - will try to delete it...")
224-
225+
225226
do
226227
{
227228
try FileManager.default.removeItem(at: AppConstants.shared.documentsDirectoryPath)
@@ -271,16 +272,14 @@ private extension View
271272
{
272273
defer
273274
{
274-
view.appState.isLoadingTaps = false
275+
view.tapTracker.isBeingLoaded = false
275276
}
276277

277-
async let tapTracker: [BrewTap] = await view.tapTracker.loadUpTappedTaps()
278-
279-
do
278+
do throws(TapLoadingError)
280279
{
281-
view.tapTracker.addedTaps = try await tapTracker
280+
view.tapTracker.addedTaps = try await view.tapTracker.loadUpTappedTaps()
282281
}
283-
catch let tapLoadingError as TapLoadingError
282+
catch let tapLoadingError
284283
{
285284
AppConstants.shared.logger.error("Failed while loading taps: \(tapLoadingError.localizedDescription)")
286285

@@ -292,14 +291,10 @@ private extension View
292291
view.appState.showAlert(errorToShow: .tapLoadingFailedDueToTapParentLocation(localizedDescription: errorDetails))
293292
case .couldNotReadTapFolderContents(let errorDetails):
294293
view.appState.showAlert(errorToShow: .tapLoadingFailedDueToTapItself(localizedDescription: errorDetails))
294+
case .couldNotParseTapName(let errorDetails):
295+
view.appState.showAlert(errorToShow: .generic(customMessage: errorDetails))
295296
}
296297
}
297-
catch let unimplementedError
298-
{
299-
AppConstants.shared.logger.error("Failed while loading taps: Unimplemented error: \(unimplementedError.localizedDescription)")
300-
301-
view.appState.failedWhileLoadingTaps = true
302-
}
303298
}
304299
}
305300

@@ -310,9 +305,9 @@ private extension View
310305
{
311306
AppConstants.shared.logger.info("Started Analytics startup action at \(Date())")
312307

313-
async let analyticsQueryCommand: TerminalOutput = await shell(AppConstants.shared.brewExecutablePath, ["analytics"])
308+
async let analyticsQueryCommand: [TerminalOutput] = await shell(AppConstants.shared.brewExecutablePath, ["analytics"])
314309

315-
if await analyticsQueryCommand.standardOutput.localizedCaseInsensitiveContains("Analytics are enabled")
310+
if await analyticsQueryCommand.standardOutputs.joined().localizedCaseInsensitiveContains("Analytics are enabled")
316311
{
317312
view.allowBrewAnalytics = true
318313
AppConstants.shared.logger.info("Analytics are ENABLED")
@@ -430,7 +425,7 @@ private extension View
430425

431426
case .massAppAdoption(let appsToAdopt):
432427
MassAppAdoptionView(appsToAdopt: appsToAdopt)
433-
428+
434429
case .fullUpdate:
435430
UpdatePackagesView()
436431

@@ -473,7 +468,7 @@ private extension View
473468
{
474469
case .generic:
475470
EmptyView()
476-
471+
477472
case .couldNotGetContentsOfPackageFolder:
478473
EmptyView()
479474

@@ -655,7 +650,6 @@ private extension View
655650
try await view.brewPackagesTracker.uninstallSelectedPackage(
656651
package: packageToUninstall,
657652
cachedDownloadsTracker: view.cachedDownloadsTracker,
658-
appState: view.appState,
659653
outdatedPackagesTracker: view.outdatedPackagesTracker,
660654
shouldRemoveAllAssociatedFiles: false
661655
)
@@ -671,7 +665,6 @@ private extension View
671665
try await view.brewPackagesTracker.uninstallSelectedPackage(
672666
package: packageToPurge,
673667
cachedDownloadsTracker: view.cachedDownloadsTracker,
674-
appState: view.appState,
675668
outdatedPackagesTracker: view.outdatedPackagesTracker,
676669
shouldRemoveAllAssociatedFiles: true
677670
)

Cork/CorkApp.swift

Lines changed: 20 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,16 @@ import SwiftUI
1717
import UserNotifications
1818
import CorkModels
1919
import CorkTerminalFunctions
20+
import CorkFeature_Brewfiles
21+
import FactoryKit
2022

2123
@main
2224
struct CorkApp: App
2325
{
2426
@NSApplicationDelegateAdaptor(AppDelegate.self) var appDelegate: AppDelegate
2527

28+
@InjectedObservable(\.brewfileManager) var brewfileManager: BrewfileManager
29+
2630
@State var brewPackagesTracker: BrewPackagesTracker = .init()
2731
@State var tapTracker: TapTracker = .init()
2832

@@ -426,13 +430,13 @@ struct CorkApp: App
426430
{
427431
AsyncButton
428432
{
429-
do
433+
do throws(BrewfileManager.BrewfileDumpingError)
430434
{
431-
brewfileContents = try await exportBrewfile(appState: appDelegate.appState)
435+
brewfileContents = try await brewfileManager.exportBrewfile(appState: appDelegate.appState)
432436

433437
isShowingBrewfileExporter = true
434438
}
435-
catch let brewfileExportError as BrewfileDumpingError
439+
catch let brewfileExportError
436440
{
437441
AppConstants.shared.logger.error("\(brewfileExportError)")
438442

@@ -455,7 +459,7 @@ struct CorkApp: App
455459

456460
AsyncButton
457461
{
458-
do
462+
do throws(BrewfileManager.BrewfileReadingError)
459463
{
460464
let picker: NSOpenPanel = .init()
461465
picker.allowsMultipleSelection = false
@@ -467,14 +471,19 @@ struct CorkApp: App
467471
guard let brewfileURL = picker.url
468472
else
469473
{
470-
throw BrewfileReadingError.couldNotGetBrewfileLocation
474+
throw BrewfileManager.BrewfileReadingError.couldNotGetBrewfileLocation
471475
}
472476

473477
AppConstants.shared.logger.debug("\(brewfileURL.path)")
474478

475-
do
479+
do throws(BrewfileManager.BrewfileReadingError)
476480
{
477-
try await importBrewfile(from: brewfileURL, appState: appDelegate.appState, brewPackagesTracker: brewPackagesTracker, cachedDownloadsTracker: cachedDownloadsTracker)
481+
try await brewfileManager.importBrewfile(
482+
from: brewfileURL,
483+
appState: appDelegate.appState,
484+
brewPackagesTracker: brewPackagesTracker,
485+
cachedDownloadsTracker: cachedDownloadsTracker
486+
)
478487
}
479488
catch let brewfileImportingError
480489
{
@@ -486,7 +495,7 @@ struct CorkApp: App
486495
}
487496
}
488497
}
489-
catch let error as BrewfileReadingError
498+
catch let error
490499
{
491500
switch error
492501
{
@@ -674,9 +683,9 @@ struct CorkApp: App
674683

675684
Task
676685
{
677-
var updateResult: TerminalOutput = await shell(AppConstants.shared.brewExecutablePath, ["update"])
686+
var updateResult: [TerminalOutput] = await shell(AppConstants.shared.brewExecutablePath, ["update"])
678687

679-
AppConstants.shared.logger.debug("Update result:\nStandard output: \(updateResult.standardOutput, privacy: .public)\nStandard error: \(updateResult.standardError, privacy: .public)")
688+
AppConstants.shared.logger.debug("Update result:\nStandard output: \(updateResult.standardOutputs, privacy: .public)\nStandard error: \(updateResult.standardErrors, privacy: .public)")
680689

681690
do
682691
{
@@ -692,7 +701,7 @@ struct CorkApp: App
692701
{
693702
AppConstants.shared.logger.log("Will purge temporary update trackers")
694703

695-
updateResult = .init(standardOutput: "", standardError: "")
704+
updateResult = .init()
696705
newOutdatedPackages = .init()
697706
}
698707

Cork/Logic/Services/Load up Services.swift

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,20 @@
55
// Created by David Bureš on 20.03.2024.
66
//
77

8-
import Foundation
98
import CorkShared
109
import CorkTerminalFunctions
10+
import Foundation
1111

1212
extension ServicesTracker
1313
{
1414
enum HomebrewServiceLoadingError: LocalizedError
1515
{
16-
case standardErrorNotEmpty(standardError: String), homebrewOutdated, standardErrorNotEmptyAndNoResultsInStandardOutput, couldNotEncodeString(String), servicesParsingFailed, otherError(String)
16+
case standardErrorNotEmpty(standardError: String)
17+
case homebrewOutdated
18+
case standardErrorNotEmptyAndNoResultsInStandardOutput
19+
case couldNotEncodeString(String)
20+
case servicesParsingFailed
21+
case otherError(String)
1722

1823
var errorDescription: String?
1924
{
@@ -34,7 +39,7 @@ extension ServicesTracker
3439
}
3540
}
3641
}
37-
42+
3843
fileprivate struct ServiceCommandOutput: Codable
3944
{
4045
/// Name of the service
@@ -67,7 +72,8 @@ extension ServicesTracker
6772

6873
// MARK: - Error checking
6974

70-
guard !rawOutput.containsErrors else
75+
guard !rawOutput.containsErrors
76+
else
7177
{
7278
AppConstants.shared.logger.error("Failed while loading up services: Standard Error not empty")
7379
if rawOutput.standardErrors.contains("brew update")
@@ -90,11 +96,12 @@ extension ServicesTracker
9096
}
9197

9298
/// Without this guard, the decoding throws, even if there was no error, just because the data is empty
93-
guard !decodableData.isEmpty else
99+
guard !decodableData.isEmpty
100+
else
94101
{
95102
return
96103
}
97-
104+
98105
let rawDecodedServicesData: [ServiceCommandOutput] = try decoder.decode([ServiceCommandOutput].self, from: decodableData)
99106

100107
var finalServices: Set<HomebrewService> = .init()

Cork/Logic/Services/Modification/Synchronize Services.swift

Lines changed: 21 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -9,49 +9,36 @@ import Foundation
99

1010
extension ServicesTracker
1111
{
12-
func synchronizeServices(preserveIDs: Bool) async throws
12+
func synchronizeServices(preserveIDs: Bool) async throws(HomebrewServiceLoadingError)
1313
{
14-
do
15-
{
16-
let dummyServicesTracker: ServicesTracker = .init()
14+
let dummyServicesTracker: ServicesTracker = .init()
1715

18-
try await dummyServicesTracker.loadServices()
16+
try await dummyServicesTracker.loadServices()
1917

20-
let updatedServices: Set<HomebrewService> = dummyServicesTracker.services
18+
let updatedServices: Set<HomebrewService> = dummyServicesTracker.services
2119

22-
if !preserveIDs
23-
{
24-
services = updatedServices
20+
if !preserveIDs
21+
{
22+
services = updatedServices
23+
}
24+
else
25+
{
26+
let originalServicesWithTheirUUIDs: [String: UUID] = services.reduce(into: [:])
27+
{ result, originalService in
28+
result[originalService.name] = originalService.id
2529
}
26-
else
27-
{
28-
let originalServicesWithTheirUUIDs: [String: UUID] = services.reduce(into: [:])
29-
{ result, originalService in
30-
result[originalService.name] = originalService.id
31-
}
3230

33-
let updatedServicesWithOldIDs: Set<HomebrewService> = Set(updatedServices.map
34-
{ updatedService in
35-
var copyUpdatedService: HomebrewService = updatedService
31+
let updatedServicesWithOldIDs: Set<HomebrewService> = Set(updatedServices.map { updatedService in
32+
var copyUpdatedService: HomebrewService = updatedService
3633

37-
for originalServiceWithItsOldUUID in originalServicesWithTheirUUIDs
38-
{
39-
if originalServiceWithItsOldUUID.key == copyUpdatedService.name
40-
{
41-
copyUpdatedService.id = originalServiceWithItsOldUUID.value
42-
}
43-
}
34+
if let preservedID = originalServicesWithTheirUUIDs[copyUpdatedService.name] {
35+
copyUpdatedService.id = preservedID
36+
}
4437

45-
return copyUpdatedService
46-
})
38+
return copyUpdatedService
39+
})
4740

48-
services = updatedServicesWithOldIDs
49-
}
50-
}
51-
catch let servicesLoadingError as HomebrewServiceLoadingError
52-
{
53-
/// Just rethrow the error further up the chain
54-
throw servicesLoadingError
41+
services = updatedServicesWithOldIDs
5542
}
5643
}
5744
}

0 commit comments

Comments
 (0)