Why Gemfury? Push, build, and install  RubyGems npm packages Python packages Maven artifacts PHP packages Go Modules Debian packages RPM packages NuGet packages

Repository URL to install this package:

Details    
ai.fluctio.fluctio-sim / EditorUtils / PackageManager / PackageManagerExtensions.cs
Size: Mime:
using System;
using System.Threading.Tasks;
using UnityEditor;
using UnityEditor.PackageManager;
using UnityEditor.PackageManager.Requests;
using PackageInfo = UnityEditor.PackageManager.PackageInfo;

namespace Fluctio.FluctioSim.EditorUtils.PackageManager
{
	public static class PackageManagerExtensions
	{
		public static string GetRawPackageId(this PackageInfo packageInfo)
		{
			// packageId might also include version, git url, etc.
			return packageInfo.packageId.Split("@")[0];
		}
		
		public static Task<T> WaitResult<T>(this Request<T> request)
		{
			var completionSource = new TaskCompletionSource<T>();
			request.OnSuccess(completionSource.SetResult);
			request.OnError(error =>
			{
				var exception = new PackageManagerException(error);
				completionSource.SetException(exception);
			});
			return completionSource.Task;
		}
		
		public static Request<T> OnSuccess<T>(this Request<T> request, Action<T> callback)
		{
			return request.AddCallback(StatusCode.Success, () => callback(request.Result));
		}
		
		public static Request<T> OnError<T>(this Request<T> request, Action<Error> callback)
		{
			return request.AddCallback(StatusCode.Failure, () => callback(request.Error));
		}
		
		public static Request<T> OnComplete<T>(this Request<T> request, Action callback)
		{
			return request.AddCallback(null, callback);
		}

		private static Request<T> AddCallback<T>(this Request<T> request, StatusCode? requiredStatusCode, Action callback)
		{
			EditorApplication.CallbackFunction handler = null;
			handler = () =>
			{
				if (!request.IsCompleted)
				{
					return;
				}
				if (requiredStatusCode == null || request.Status == requiredStatusCode)
				{
					callback();
				}
				EditorApplication.update -= handler;
			};
			EditorApplication.update += handler;
			return request;
		}
	}

	[Serializable]
	public class PackageManagerException : Exception
	{
		public PackageManagerException (Error error) : base(error.message) {}
	}
}