world-manager/World Manager for Minecraft/Models/Sources/SourceOrigin.swift
2026-06-01 20:50:52 -05:00

126 lines
3.7 KiB
Swift

// SPDX-FileCopyrightText: 2026 John Burwell and contributors
// SPDX-License-Identifier: AGPL-3.0-or-later
import Foundation
nonisolated struct ConnectedDevice: Identifiable, Hashable, Sendable, Codable {
let udid: String
var name: String
var productType: String?
var osVersion: String?
var connection: DeviceConnection
var trustState: DeviceTrustState
var id: String { udid }
}
nonisolated enum DeviceConnection: String, Hashable, Sendable, Codable {
case usb
case network
}
nonisolated enum DeviceTrustState: String, Hashable, Sendable, Codable {
case unavailable
case locked
case untrusted
case trusted
}
nonisolated struct DeviceAppContainer: Identifiable, Hashable, Sendable, Codable {
let deviceUDID: String
let appID: String
var appName: String
var accessMode: DeviceContainerAccessMode
var minecraftFolderRelativePath: String?
var id: String {
[deviceUDID, appID, accessMode.rawValue].joined(separator: "::")
}
}
nonisolated enum DeviceContainerAccessMode: String, Hashable, Sendable, Codable {
case documents
case container
}
nonisolated enum MinecraftSourceOrigin: Hashable, Sendable, Codable {
case localFolder(bookmarkData: Data?)
case javaLocalFolder(bookmarkData: Data?)
case connectedDevice(device: ConnectedDevice, container: DeviceAppContainer)
nonisolated var defaultAccessorIdentifier: SourceAccessorIdentifier {
switch self {
case .localFolder:
return LocalFolderSourceAccess().accessorIdentifier
case .javaLocalFolder:
return JavaLocalFolderSourceAccess().accessorIdentifier
case .connectedDevice:
return AppleMobileDeviceSourceAccess().accessorIdentifier
}
}
nonisolated var defaultEdition: MinecraftEdition {
switch self {
case .localFolder, .connectedDevice:
return .bedrock
case .javaLocalFolder:
return .java
}
}
nonisolated var kind: MinecraftSourceKind {
switch self {
case .localFolder, .javaLocalFolder:
return .localFolder
case .connectedDevice:
return .connectedDevice
}
}
nonisolated var defaultRefreshStrategy: SourceRefreshStrategy {
switch self {
case .localFolder, .javaLocalFolder:
return .eagerFullScan
case .connectedDevice:
return .staged
}
}
nonisolated var defaultCapabilities: SourceCapabilities {
switch self {
case .localFolder, .javaLocalFolder:
return .localFolder
case .connectedDevice:
return .connectedDevice
}
}
nonisolated func defaultAccessStatus(displayName: String) -> SourceAccessStatus {
switch self {
case .localFolder(let bookmarkData), .javaLocalFolder(let bookmarkData):
return SourceAccessStatus(
availability: .unknown,
mode: bookmarkData == nil ? .localFileSystem : .securityScopedLocalFolder,
displayName: displayName,
iconSystemName: "folder",
statusText: nil,
warningText: nil
)
case .connectedDevice(let device, _):
return SourceAccessStatus(
availability: .unknown,
mode: device.connection == .usb ? .usbDevice : .networkDevice,
displayName: displayName,
iconSystemName: "iphone.gen3",
statusText: nil,
warningText: nil
)
}
}
}
nonisolated enum MinecraftSourceKind: String, Hashable, Sendable, Codable {
case localFolder
case connectedDevice
}