// // 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") } } } }