コード例 #1
0
ファイル: RantEngine.cs プロジェクト: polytronicgr/Rant
        /// <summary>
        /// Loads the specified package into the engine.
        /// </summary>
        /// <param name="package">The package to load.</param>
        public void LoadPackage(RantPackage package)
        {
            if (package == null)
            {
                throw new ArgumentNullException(nameof(package));
            }
            if (_loadedPackages.Contains(RantPackageDependency.Create(package)))
            {
                return;
            }

            foreach (var dependency in package.GetDependencies())
            {
                if (!_resolver.TryResolvePackage(dependency, out RantPackage pkg))
                {
                    throw new FileNotFoundException(GetString("err-unresolvable-package", package, dependency));
                }
                LoadPackage(pkg);
            }

            foreach (var res in package.GetResources())
            {
                res.Load(this);
            }

            _loadedPackages.Add(RantPackageDependency.Create(package));
        }
コード例 #2
0
ファイル: RantPackage.cs プロジェクト: nicolasmaurice/Rant
 /// <summary>
 /// Removes the specified dependency from the package.
 /// </summary>
 /// <param name="dependency">The dependency to remove.</param>
 /// <returns></returns>
 public bool RemoveDependency(RantPackageDependency dependency)
 {
     if (dependency == null)
     {
         throw new ArgumentNullException(nameof(dependency));
     }
     return(_dependencies.Remove(dependency));
 }
コード例 #3
0
ファイル: RantPackage.cs プロジェクト: nicolasmaurice/Rant
 /// <summary>
 /// Adds the specified dependency to the package.
 /// </summary>
 /// <param name="dependency">The dependency to add.</param>
 public void AddDependency(RantPackageDependency dependency)
 {
     if (dependency == null)
     {
         throw new ArgumentNullException(nameof(dependency));
     }
     _dependencies.Add(dependency);
 }
コード例 #4
0
ファイル: RantPackage.cs プロジェクト: nicolasmaurice/Rant
 /// <summary>
 /// Determines whether the package has the specified dependency.
 /// </summary>
 /// <param name="dependency">The dependency to check for.</param>
 /// <returns></returns>
 public bool DependsOn(RantPackageDependency dependency)
 {
     if (dependency == null)
     {
         throw new ArgumentNullException(nameof(dependency));
     }
     return(_dependencies.Contains(dependency));
 }
コード例 #5
0
ファイル: RantEngine.cs プロジェクト: lzxkulou/Rant
        /// <summary>
        /// Loads the specified package into the engine.
        /// </summary>
        /// <param name="package">The package to load.</param>
        /// <param name="mergeBehavior">The table merging strategy to employ.</param>
        public void LoadPackage(RantPackage package, TableMergeBehavior mergeBehavior = TableMergeBehavior.Naive)
        {
            if (package == null)
            {
                throw new ArgumentNullException(nameof(package));
            }
            if (_loadedPackages.Contains(RantPackageDependency.Create(package)))
            {
                return;
            }

            var patterns = package.GetPatterns();
            var tables   = package.GetTables();

            if (patterns.Any())
            {
                foreach (var pattern in patterns)
                {
                    _patternCache[pattern.Name] = pattern;
                    if (pattern.Module != null)
                    {
                        PackageModules[pattern.Name] = pattern.Module;
                    }
                }
            }

            if (tables.Any())
            {
                if (_dictionary == null)
                {
                    _dictionary = new RantDictionary(tables, mergeBehavior);
                }
                else
                {
                    foreach (var table in tables)
                    {
                        _dictionary.AddTable(table, mergeBehavior);
                    }
                }
            }

            _loadedPackages.Add(RantPackageDependency.Create(package));

            foreach (var dependency in package.GetDependencies())
            {
                RantPackage pkg;
                if (!_resolver.TryResolvePackage(dependency, out pkg))
                {
                    throw new FileNotFoundException($"Package '{package}' was unable to resolve dependency '{dependency}'");
                }
                LoadPackage(pkg, mergeBehavior);
            }
        }
コード例 #6
0
        /// <summary>
        /// Attempts to resolve a depdendency to the appropriate package.
        /// </summary>
        /// <param name="depdendency">The depdendency to resolve.</param>
        /// <param name="package">The package loaded from the depdendency.</param>
        /// <returns></returns>
        public virtual bool TryResolvePackage(RantPackageDependency depdendency, out RantPackage package)
        {
            package = null;
            var path = Path.Combine(Environment.CurrentDirectory, $"{depdendency.ID}.rantpkg");

            if (!File.Exists(path))
            {
                RantPackageVersion version;
                // Fallback to name with version appended
#if UNITY
                path = Directory.GetFiles(Environment.CurrentDirectory, $"{depdendency.ID}*.rantpkg", SearchOption.AllDirectories).FirstOrDefault(p =>
#else
                path = Directory.EnumerateFiles(Environment.CurrentDirectory, "*.rantpkg", SearchOption.AllDirectories).FirstOrDefault(p =>
#endif

                {
                    var match = FallbackRegex.Match(Path.GetFileNameWithoutExtension(p));
                    if (!match.Success)
                    {
                        return(false);
                    }
                    version = RantPackageVersion.Parse(match.Groups["version"].Value);
                    return((depdendency.AllowNewer && version >= depdendency.Version) || depdendency.Version == version);
                });
                if (path == null)
                {
                    return(false);
                }
            }
            try
            {
                var pkg = RantPackage.Load(path);
                                           if (pkg.ID != depdendency.ID)
                {
                    return(false);
                }
                                           if ((depdendency.AllowNewer && pkg.Version >= depdendency.Version) || pkg.Version == depdendency.Version)
                {
                    package = pkg;
                    return(true);
                }
                                           return(false);
            }
            catch
            {
                return(false);
            }
        }
コード例 #7
0
		public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
		{
			var array = JArray.Load(reader);
			var list = new List<RantPackageDependency>();
			foreach (var item in array)
			{
				var obj = item as JObject;
				if (obj == null) continue;
				var tId = obj["id"] as JValue;
				if (tId == null) continue;
				var tVersion = obj["version"] as JValue;
				if (tVersion == null) continue;
				var tAllowNewer = obj["allow-newer"] as JValue;
				var dep = new RantPackageDependency(tId.Value.ToString(), tVersion.Value.ToString());
				if (tAllowNewer != null && tAllowNewer.Type == JTokenType.Boolean)
					dep.AllowNewer = (bool)tAllowNewer.Value;
				list.Add(dep);
			}
			return list;
		}
コード例 #8
0
		/// <summary>
		/// Attempts to resolve a depdendency to the appropriate package.
		/// </summary>
		/// <param name="depdendency">The depdendency to resolve.</param>
		/// <param name="package">The package loaded from the depdendency.</param>
		/// <returns></returns>
		public virtual bool TryResolvePackage(RantPackageDependency depdendency, out RantPackage package)
		{
			package = null;
			var path = Path.Combine(Environment.CurrentDirectory, $"{depdendency.ID}.rantpkg");
			if (!File.Exists(path))
			{
				RantPackageVersion version;
				// Fallback to name with version appended
#if UNITY
				path = Directory.GetFiles(Environment.CurrentDirectory, $"{depdendency.ID}*.rantpkg", SearchOption.AllDirectories).FirstOrDefault(p =>
#else
				path = Directory.EnumerateFiles(Environment.CurrentDirectory, "*.rantpkg", SearchOption.AllDirectories).FirstOrDefault(p =>
#endif

				{
					var match = FallbackRegex.Match(Path.GetFileNameWithoutExtension(p));
					if (!match.Success) return false;
					version = RantPackageVersion.Parse(match.Groups["version"].Value);
					return (depdendency.AllowNewer && version >= depdendency.Version) || depdendency.Version == version;
				});
				if (path == null) return false;
			}
			try
			{
				var pkg = RantPackage.Load(path);
				if (pkg.ID != depdendency.ID) return false;
				if ((depdendency.AllowNewer && pkg.Version >= depdendency.Version) || pkg.Version == depdendency.Version)
				{
					package = pkg;
					return true;
				}
				return false;
			}
			catch
			{
				return false;
			}
		}
コード例 #9
0
ファイル: RantPackage.cs プロジェクト: W-h-a-t-s/Rant
		/// <summary>
		/// Adds the specified dependency to the package.
		/// </summary>
		/// <param name="dependency">The dependency to add.</param>
	    public void AddDependency(RantPackageDependency dependency)
		{
			if (dependency == null) throw new ArgumentNullException(nameof(dependency));
			_dependencies.Add(dependency);
		}
コード例 #10
0
ファイル: RantPackage.cs プロジェクト: W-h-a-t-s/Rant
		/// <summary>
		/// Removes the specified dependency from the package.
		/// </summary>
		/// <param name="dependency">The dependency to remove.</param>
		/// <returns></returns>
	    public bool RemoveDependency(RantPackageDependency dependency)
	    {
		    if (dependency == null) throw new ArgumentNullException(nameof(dependency));
		    return _dependencies.Remove(dependency);
	    }
コード例 #11
0
ファイル: RantPackage.cs プロジェクト: W-h-a-t-s/Rant
		/// <summary>
		/// Determines whether the package has the specified dependency.
		/// </summary>
		/// <param name="dependency">The dependency to check for.</param>
		/// <returns></returns>
	    public bool DependsOn(RantPackageDependency dependency)
	    {
		    if (dependency == null) throw new ArgumentNullException(nameof(dependency));
		    return _dependencies.Contains(dependency);
	    }