123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192 |
- #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
|