193 lines
		
	
	
		
			6.6 KiB
		
	
	
	
		
			C#
		
	
	
	
		
		
			
		
	
	
			193 lines
		
	
	
		
			6.6 KiB
		
	
	
	
		
			C#
		
	
	
	
|  | #if UNITY_2019_2_OR_NEWER | ||
|  | using System; | ||
|  | using System.Collections.Generic; | ||
|  | using System.IO; | ||
|  | using System.Linq; | ||
|  | using AppLovinMax.ThirdParty.MiniJson; | ||
|  | 
 | ||
|  | namespace AppLovinMax.Scripts.IntegrationManager.Editor | ||
|  | { | ||
|  |     public class AppLovinUpmManifest | ||
|  |     { | ||
|  |         private const string KeyUrl = "url"; | ||
|  |         private const string KeyName = "name"; | ||
|  |         private const string KeyScopes = "scopes"; | ||
|  |         private const string KeyScopedRegistry = "scopedRegistries"; | ||
|  | 
 | ||
|  |         private Dictionary<string, object> manifest; | ||
|  | 
 | ||
|  |         private static string ManifestPath | ||
|  |         { | ||
|  |             get { return Path.Combine(Directory.GetCurrentDirectory(), "Packages/manifest.json"); } | ||
|  |         } | ||
|  | 
 | ||
|  |         // Private constructor to enforce the use of the Load() method | ||
|  |         private AppLovinUpmManifest() { } | ||
|  | 
 | ||
|  |         /// <summary> | ||
|  |         /// Creates a new instance of AppLovinUpmManifest and loads the manifest.json file. | ||
|  |         /// </summary> | ||
|  |         /// <returns>An instance of AppLovinUpmManifest</returns> | ||
|  |         public static AppLovinUpmManifest Load() | ||
|  |         { | ||
|  |             return new AppLovinUpmManifest { manifest = GetManifest() }; | ||
|  |         } | ||
|  | 
 | ||
|  |         /// <summary> | ||
|  |         /// Adds or updates a scoped registry in the manifest. | ||
|  |         /// </summary> | ||
|  |         /// <param name="name">The name of the registry</param> | ||
|  |         /// <param name="url">The url of the registry</param> | ||
|  |         /// <param name="scopes">The scopes of the registry</param> | ||
|  |         public void AddOrUpdateRegistry(string name, string url, List<string> scopes) | ||
|  |         { | ||
|  |             var registry = GetRegistry(name); | ||
|  |             if (registry == null) | ||
|  |             { | ||
|  |                 var registries = GetRegistries(); | ||
|  |                 if (registries == null) return; | ||
|  | 
 | ||
|  |                 registries.Add(new Dictionary<string, object> | ||
|  |                 { | ||
|  |                     {KeyName, name}, | ||
|  |                     {KeyUrl, url}, | ||
|  |                     {KeyScopes, scopes} | ||
|  |                 }); | ||
|  | 
 | ||
|  |                 return; | ||
|  |             } | ||
|  | 
 | ||
|  |             UpdateRegistry(registry, scopes); | ||
|  |         } | ||
|  | 
 | ||
|  |         /// <summary> | ||
|  |         /// Saves the manifest by serializing it back to JSON and writing to file. | ||
|  |         /// </summary> | ||
|  |         public void Save() | ||
|  |         { | ||
|  |             var content = Json.Serialize(manifest, true); | ||
|  |             File.WriteAllText(ManifestPath, content); | ||
|  |         } | ||
|  | 
 | ||
|  |         /// <summary> | ||
|  |         /// Adds a dependency to the manifest. | ||
|  |         /// </summary> | ||
|  |         /// <param name="packageName">The name of the package to add</param> | ||
|  |         /// <param name="version">The version of the package to add</param> | ||
|  |         public void AddPackageDependency(string packageName, string version) | ||
|  |         { | ||
|  |             var manifestDependencies = GetDependencies(); | ||
|  |             manifestDependencies[packageName] = version; | ||
|  |         } | ||
|  | 
 | ||
|  |         /// <summary> | ||
|  |         /// Removes a dependency from the manifest. | ||
|  |         /// </summary> | ||
|  |         /// <param name="packageName">The name of the package to remove</param> | ||
|  |         public void RemovePackageDependency(string packageName) | ||
|  |         { | ||
|  |             var manifestDependencies = GetDependencies(); | ||
|  |             manifestDependencies.Remove(packageName); | ||
|  |         } | ||
|  | 
 | ||
|  |         #region Utility | ||
|  | 
 | ||
|  |         /// <summary> | ||
|  |         /// Returns the manifest.json file as a dictionary. | ||
|  |         /// </summary> | ||
|  |         private static Dictionary<string, object> GetManifest() | ||
|  |         { | ||
|  |             if (!File.Exists(ManifestPath)) | ||
|  |             { | ||
|  |                 throw new Exception("Manifest not Found!"); | ||
|  |             } | ||
|  | 
 | ||
|  |             var manifestJson = File.ReadAllText(ManifestPath); | ||
|  |             if (string.IsNullOrEmpty(manifestJson)) | ||
|  |             { | ||
|  |                 throw new Exception("Manifest is empty!"); | ||
|  |             } | ||
|  | 
 | ||
|  |             var deserializedManifest = Json.Deserialize(manifestJson) as Dictionary<string, object>; | ||
|  |             if (deserializedManifest == null) | ||
|  |             { | ||
|  |                 throw new Exception("Failed to deserialize manifest"); | ||
|  |             } | ||
|  | 
 | ||
|  |             return deserializedManifest; | ||
|  |         } | ||
|  | 
 | ||
|  |         /// <summary> | ||
|  |         /// Gets the manifest's dependencies section. | ||
|  |         /// </summary> | ||
|  |         /// <returns>The dependencies section of the manifest.</returns> | ||
|  |         private Dictionary<string, object> GetDependencies() | ||
|  |         { | ||
|  |             var dependencies = manifest["dependencies"] as Dictionary<string, object>; | ||
|  |             if (dependencies == null) | ||
|  |             { | ||
|  |                 throw new Exception("No dependencies found in manifest."); | ||
|  |             } | ||
|  | 
 | ||
|  |             return dependencies; | ||
|  |         } | ||
|  | 
 | ||
|  |         /// <summary> | ||
|  |         /// Gets the manifest's registries section. Creates a new registries section if one does not exist. | ||
|  |         /// </summary> | ||
|  |         /// <returns>The registries section of the manifest.</returns> | ||
|  |         private List<object> GetRegistries() | ||
|  |         { | ||
|  |             EnsureScopedRegistryExists(); | ||
|  |             return manifest[KeyScopedRegistry] as List<object>; | ||
|  |         } | ||
|  | 
 | ||
|  |         /// <summary> | ||
|  |         /// Gets a scoped registry with the given name. | ||
|  |         /// </summary> | ||
|  |         /// <param name="name">The name of the registry</param> | ||
|  |         /// <returns>Returns the registry, or null if it can't be found</returns> | ||
|  |         private Dictionary<string, object> GetRegistry(string name) | ||
|  |         { | ||
|  |             var registries = GetRegistries(); | ||
|  |             if (registries == null) return null; | ||
|  | 
 | ||
|  |             return registries | ||
|  |                 .OfType<Dictionary<string, object>>() | ||
|  |                 .FirstOrDefault(registry => MaxSdkUtils.GetStringFromDictionary(registry, KeyName).Equals(name)); | ||
|  |         } | ||
|  | 
 | ||
|  |         /// <summary> | ||
|  |         /// Creates the section for scoped registries in the manifest.json file if it doesn't exist. | ||
|  |         /// </summary> | ||
|  |         private void EnsureScopedRegistryExists() | ||
|  |         { | ||
|  |             if (manifest.ContainsKey(KeyScopedRegistry)) return; | ||
|  | 
 | ||
|  |             manifest.Add(KeyScopedRegistry, new List<object>()); | ||
|  |         } | ||
|  | 
 | ||
|  |         /// <summary> | ||
|  |         /// Updates a registry to make sure it contains the new scopes. | ||
|  |         /// </summary> | ||
|  |         /// <param name="registry">The registry to update</param> | ||
|  |         /// <param name="newScopes">The scopes we want added to the registry</param> | ||
|  |         private static void UpdateRegistry(Dictionary<string, object> registry, List<string> newScopes) | ||
|  |         { | ||
|  |             var scopes = MaxSdkUtils.GetListFromDictionary(registry, KeyScopes); | ||
|  |             if (scopes == null) | ||
|  |             { | ||
|  |                 registry[KeyScopes] = new List<string>(newScopes); | ||
|  |                 return; | ||
|  |             } | ||
|  | 
 | ||
|  |             // Only add scopes that are not already in the list | ||
|  |             var uniqueNewScopes = newScopes.Where(scope => !scopes.Contains(scope)).ToList(); | ||
|  |             scopes.AddRange(uniqueNewScopes); | ||
|  |         } | ||
|  | 
 | ||
|  |         #endregion | ||
|  |     } | ||
|  | } | ||
|  | #endif |