Files
steipete--codexbar/Sources/CodexBar/LaunchAtLoginManager.swift
T
2026-07-13 12:22:33 +08:00

57 lines
1.8 KiB
Swift

import CodexBarCore
import ServiceManagement
enum LaunchAtLoginManager {
typealias StatusProvider = () -> SMAppService.Status
typealias RegistrationAction = () throws -> Void
private static let isRunningTests: Bool = {
let env = ProcessInfo.processInfo.environment
if env["XCTestConfigurationFilePath"] != nil { return true }
if env["TESTING_LIBRARY_VERSION"] != nil { return true }
if env["SWIFT_TESTING"] != nil { return true }
return NSClassFromString("XCTestCase") != nil
}()
static func setEnabled(_ enabled: Bool) {
if self.isRunningTests { return }
let service = SMAppService.mainApp
self.setEnabled(
enabled,
status: { service.status },
register: { try service.register() },
unregister: { try service.unregister() })
}
static func setEnabled(
_ enabled: Bool,
status: StatusProvider,
register: RegistrationAction,
unregister: RegistrationAction)
{
do {
if enabled {
switch status() {
case .enabled, .requiresApproval:
return
case .notRegistered, .notFound:
try register()
@unknown default:
try register()
}
} else {
switch status() {
case .enabled, .requiresApproval:
try unregister()
case .notRegistered, .notFound:
return
@unknown default:
try unregister()
}
}
} catch {
CodexBarLog.logger(LogCategories.launchAtLogin).error("Failed to update login item: \(error)")
}
}
}