namespace AlicizaX.PackageManager.Editor { using System; using UnityEditor; using UnityEditor.PackageManager; using UnityEditor.PackageManager.Requests; internal static class PackageOperationRunner { private static AddRequest s_addRequest; private static RemoveRequest s_removeRequest; private static Action s_callback; private static string s_operationName; public static bool IsBusy => s_addRequest != null || s_removeRequest != null; public static void RunAdd(string packageIdentifier, Action callback) { if (IsBusy) { callback?.Invoke(false, "Another package operation is in progress."); return; } s_operationName = $"Add {packageIdentifier}"; s_callback = callback; s_addRequest = Client.Add(packageIdentifier); EditorApplication.update -= Poll; EditorApplication.update += Poll; } public static void RunRemove(string packageName, Action callback) { if (IsBusy) { callback?.Invoke(false, "Another package operation is in progress."); return; } s_operationName = $"Remove {packageName}"; s_callback = callback; s_removeRequest = Client.Remove(packageName); EditorApplication.update -= Poll; EditorApplication.update += Poll; } private static void Poll() { if (s_addRequest != null) { if (!s_addRequest.IsCompleted) { return; } var success = s_addRequest.Status == StatusCode.Success; var message = success ? s_addRequest.Result?.name : s_addRequest.Error?.message; s_addRequest = null; Complete(success, message); return; } if (s_removeRequest != null) { if (!s_removeRequest.IsCompleted) { return; } var success = s_removeRequest.Status == StatusCode.Success; var message = success ? s_removeRequest.PackageIdOrName : s_removeRequest.Error?.message; s_removeRequest = null; Complete(success, message); return; } EditorApplication.update -= Poll; } private static void Complete(bool success, string message) { EditorApplication.update -= Poll; var callback = s_callback; var operationName = s_operationName; s_callback = null; s_operationName = null; if (!success) { UnityEngine.Debug.LogError($"{operationName} failed: {message}"); } callback?.Invoke(success, message); } } }