1
0
mirror of https://github.com/nicoverbruggen/phpmon.git synced 2025-08-08 12:29:54 +02:00
Files
app/phpmon/Modules/PHP Doctor/Data/WarningManager.swift
2023-07-18 19:56:09 +02:00

117 lines
3.8 KiB
Swift

//
// WarningManager.swift
// PHP Monitor
//
// Created by Nico Verbruggen on 09/08/2022.
// Copyright © 2023 Nico Verbruggen. All rights reserved.
//
import Foundation
import Cocoa
class WarningManager: ObservableObject {
static var shared: WarningManager = WarningManager()
/// These warnings are the ones that are ready to be displayed.
@Published public var warnings: [Warning] = []
/// This variable is thread-safe and may be modified at any time.
/// When all temporary warnings are set, you may broadcast these changes
/// and they will be sent to the @Published variable via the main thread.
private var temporaryWarnings: [Warning] = []
init() {
if isRunningSwiftUIPreview {
/// SwiftUI previews will always list all possible evaluations.
self.warnings = self.evaluations
}
}
public let evaluations: [Warning] = [
Warning(
command: {
return await Shell.pipe("sysctl -n sysctl.proc_translated").out
.trimmingCharacters(in: .whitespacesAndNewlines) == "1"
},
name: "Running PHP Monitor with Rosetta on M1",
title: "warnings.arm_compatibility.title".localized,
paragraphs: { return ["warnings.arm_compatibility.description".localized] },
url: "https://github.com/nicoverbruggen/phpmon/wiki/PHP-Monitor-and-Apple-Silicon"
),
Warning(
command: {
return !Shell.PATH.contains("\(Paths.homePath)/.config/phpmon/bin") &&
!FileSystem.isWriteableFile("/usr/local/bin/")
},
name: "Helpers cannot be symlinked and not in PATH",
title: "warnings.helper_permissions.title".localized,
paragraphs: { return [
"warnings.helper_permissions.description".localized,
"warnings.helper_permissions.unavailable".localized,
"warnings.helper_permissions.symlink".localized
] },
url: "https://github.com/nicoverbruggen/phpmon/wiki/PHP-Monitor-helper-binaries"
),
Warning(
command: {
PhpConfigChecker.shared.check()
return !PhpConfigChecker.shared.missing.isEmpty
},
name: "Your PHP installation is missing configuration files",
title: "warnings.files_missing.title".localized,
paragraphs: { return [
"warnings.files_missing.description".localized(
PhpConfigChecker.shared.missing.joined(separator: "\n")
)
] },
url: nil
)
]
public func hasWarnings() -> Bool {
return !warnings.isEmpty
}
func evaluateWarnings() {
Task { await WarningManager.shared.checkEnvironment() }
}
@MainActor func clearWarnings() {
self.warnings = []
}
@MainActor func broadcastWarnings() {
self.warnings = temporaryWarnings
}
/**
Checks the user's environment and checks if any special warnings apply.
*/
func checkEnvironment() async {
if ProcessInfo.processInfo.environment["EXTREME_DOCTOR_MODE"] != nil {
self.temporaryWarnings = self.evaluations
await self.broadcastWarnings()
return
}
await evaluate()
await MainMenu.shared.rebuild()
}
/**
Runs through all evaluations and appends any applicable warning results.
Will automatically broadcast these warnings.
*/
private func evaluate() async {
self.temporaryWarnings = []
for check in self.evaluations where await check.applies() {
Log.info("[DOCTOR] \(check.name) (!)")
self.temporaryWarnings.append(check)
continue
}
await self.broadcastWarnings()
}
}