123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172 |
- //
- // Copyright © 2024 naveenrajm7. All rights reserved.
- //
- // Licensed under the Apache License, Version 2.0 (the "License");
- // you may not use this file except in compliance with the License.
- // You may obtain a copy of the License at
- //
- // http://www.apache.org/licenses/LICENSE-2.0
- //
- // Unless required by applicable law or agreed to in writing, software
- // distributed under the License is distributed on an "AS IS" BASIS,
- // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- // See the License for the specific language governing permissions and
- // limitations under the License.
- //
- import Foundation
- @MainActor
- @objc(UTMScriptingImportCommand)
- class UTMScriptingImportCommand: NSCreateCommand, UTMScriptable {
-
- private var data: UTMData? {
- (NSApp.scriptingDelegate as? AppDelegate)?.data
- }
-
- @objc override func performDefaultImplementation() -> Any? {
- if createClassDescription.implementationClassName == "UTMScriptingVirtualMachineImpl" {
- withScriptCommand(self) { [self] in
- // Retrieve the import file URL from the evaluated arguments
- guard let fileUrl = evaluatedArguments?["file"] as? URL else {
- throw ScriptingError.fileNotSpecified
- }
-
- // Validate the file (UTM is a directory) path
- guard FileManager.default.fileExists(atPath: fileUrl.path) else {
- throw ScriptingError.fileNotFound
- }
- return try await importVirtualMachine(from: fileUrl).objectSpecifier
- }
- return nil
- } else {
- return super.performDefaultImplementation()
- }
- }
-
- private func importVirtualMachine(from url: URL) async throws -> UTMScriptingVirtualMachineImpl {
- guard let data = data else {
- throw ScriptingError.notReady
- }
-
- // import the VM
- let vm = try await data.importNewUTM(from: url)
-
- // return VM scripting object
- return UTMScriptingVirtualMachineImpl(for: vm, data: data)
- }
-
- enum ScriptingError: Error, LocalizedError {
- case notReady
- case fileNotFound
- case fileNotSpecified
-
- var errorDescription: String? {
- switch self {
- case .notReady: return NSLocalizedString("UTM is not ready to accept commands.", comment: "UTMScriptingAppDelegate")
- case .fileNotFound: return NSLocalizedString("A valid UTM file must be specified.", comment: "UTMScriptingAppDelegate")
- case .fileNotSpecified: return NSLocalizedString("No file specified in the command.", comment: "UTMScriptingAppDelegate")
- }
- }
- }
- }
|