add basic dependencies to manifest (#285)

This commit is contained in:
Jesse Plamondon-Willard 2017-05-12 01:15:02 -04:00
parent 17ff230d8e
commit 3da27346c6
6 changed files with 76 additions and 11 deletions

View File

@ -21,7 +21,7 @@ namespace StardewModdingAPI.Framework.Models
public string Author { get; set; } public string Author { get; set; }
/// <summary>The mod version.</summary> /// <summary>The mod version.</summary>
[JsonConverter(typeof(SemanticVersionConverter))] [JsonConverter(typeof(ManifestFieldConverter))]
public ISemanticVersion Version { get; set; } public ISemanticVersion Version { get; set; }
/// <summary>The minimum SMAPI version required by this mod, if any.</summary> /// <summary>The minimum SMAPI version required by this mod, if any.</summary>
@ -30,6 +30,10 @@ namespace StardewModdingAPI.Framework.Models
/// <summary>The name of the DLL in the directory that has the <see cref="Mod.Entry"/> method.</summary> /// <summary>The name of the DLL in the directory that has the <see cref="Mod.Entry"/> method.</summary>
public string EntryDll { get; set; } public string EntryDll { get; set; }
/// <summary>The other mods that must be loaded before this mod.</summary>
[JsonConverter(typeof(ManifestFieldConverter))]
public IManifestDependency[] Dependencies { get; set; }
/// <summary>The unique mod ID.</summary> /// <summary>The unique mod ID.</summary>
public string UniqueID { get; set; } public string UniqueID { get; set; }

View File

@ -0,0 +1,23 @@
namespace StardewModdingAPI.Framework.Models
{
/// <summary>A mod dependency listed in a mod manifest.</summary>
internal class ManifestDependency : IManifestDependency
{
/*********
** Accessors
*********/
/// <summary>The unique mod ID to require.</summary>
public string UniqueID { get; set; }
/*********
** Public methods
*********/
/// <summary>Construct an instance.</summary>
/// <param name="uniqueID">The unique mod ID to require.</param>
public ManifestDependency(string uniqueID)
{
this.UniqueID = uniqueID;
}
}
}

View File

@ -1,11 +1,13 @@
using System; using System;
using System.Collections.Generic;
using Newtonsoft.Json; using Newtonsoft.Json;
using Newtonsoft.Json.Linq; using Newtonsoft.Json.Linq;
using StardewModdingAPI.Framework.Models;
namespace StardewModdingAPI.Framework.Serialisation namespace StardewModdingAPI.Framework.Serialisation
{ {
/// <summary>Overrides how SMAPI reads and writes <see cref="ISemanticVersion"/>.</summary> /// <summary>Overrides how SMAPI reads and writes <see cref="ISemanticVersion"/> and <see cref="IManifestDependency"/> fields.</summary>
internal class SemanticVersionConverter : JsonConverter internal class ManifestFieldConverter : JsonConverter
{ {
/********* /*********
** Accessors ** Accessors
@ -21,7 +23,7 @@ namespace StardewModdingAPI.Framework.Serialisation
/// <param name="objectType">The object type.</param> /// <param name="objectType">The object type.</param>
public override bool CanConvert(Type objectType) public override bool CanConvert(Type objectType)
{ {
return objectType == typeof(ISemanticVersion); return objectType == typeof(ISemanticVersion) || objectType == typeof(IManifestDependency[]);
} }
/// <summary>Reads the JSON representation of the object.</summary> /// <summary>Reads the JSON representation of the object.</summary>
@ -31,12 +33,31 @@ namespace StardewModdingAPI.Framework.Serialisation
/// <param name="serializer">The calling serializer.</param> /// <param name="serializer">The calling serializer.</param>
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{ {
JObject obj = JObject.Load(reader); // semantic version
int major = obj.Value<int>("MajorVersion"); if (objectType == typeof(ISemanticVersion))
int minor = obj.Value<int>("MinorVersion"); {
int patch = obj.Value<int>("PatchVersion"); JObject obj = JObject.Load(reader);
string build = obj.Value<string>("Build"); int major = obj.Value<int>(nameof(ISemanticVersion.MajorVersion));
return new SemanticVersion(major, minor, patch, build); int minor = obj.Value<int>(nameof(ISemanticVersion.MinorVersion));
int patch = obj.Value<int>(nameof(ISemanticVersion.PatchVersion));
string build = obj.Value<string>(nameof(ISemanticVersion.Build));
return new SemanticVersion(major, minor, patch, build);
}
// manifest dependency
if (objectType == typeof(IManifestDependency[]))
{
List<IManifestDependency> result = new List<IManifestDependency>();
foreach (JObject obj in JArray.Load(reader).Children<JObject>())
{
string uniqueID = obj.Value<string>(nameof(IManifestDependency.UniqueID));
result.Add(new ManifestDependency(uniqueID));
}
return result.ToArray();
}
// unknown
throw new NotSupportedException($"Unknown type '{objectType?.FullName}'.");
} }
/// <summary>Writes the JSON representation of the object.</summary> /// <summary>Writes the JSON representation of the object.</summary>

View File

@ -29,6 +29,9 @@ namespace StardewModdingAPI
/// <summary>The name of the DLL in the directory that has the <see cref="Mod.Entry"/> method.</summary> /// <summary>The name of the DLL in the directory that has the <see cref="Mod.Entry"/> method.</summary>
string EntryDll { get; } string EntryDll { get; }
/// <summary>The other mods that must be loaded before this mod.</summary>
IManifestDependency[] Dependencies { get; }
/// <summary>Any manifest fields which didn't match a valid field.</summary> /// <summary>Any manifest fields which didn't match a valid field.</summary>
IDictionary<string, object> ExtraFields { get; } IDictionary<string, object> ExtraFields { get; }
} }

View File

@ -0,0 +1,12 @@
namespace StardewModdingAPI
{
/// <summary>A mod dependency listed in a mod manifest.</summary>
public interface IManifestDependency
{
/*********
** Accessors
*********/
/// <summary>The unique mod ID to require.</summary>
string UniqueID { get; }
}
}

View File

@ -133,6 +133,7 @@
<Compile Include="Framework\Logging\ConsoleInterceptionManager.cs" /> <Compile Include="Framework\Logging\ConsoleInterceptionManager.cs" />
<Compile Include="Framework\Logging\InterceptingTextWriter.cs" /> <Compile Include="Framework\Logging\InterceptingTextWriter.cs" />
<Compile Include="Framework\CommandHelper.cs" /> <Compile Include="Framework\CommandHelper.cs" />
<Compile Include="Framework\Models\ManifestDependency.cs" />
<Compile Include="Framework\Models\ModCompatibilityType.cs" /> <Compile Include="Framework\Models\ModCompatibilityType.cs" />
<Compile Include="Framework\Models\SConfig.cs" /> <Compile Include="Framework\Models\SConfig.cs" />
<Compile Include="Framework\ModLoading\ModMetadata.cs" /> <Compile Include="Framework\ModLoading\ModMetadata.cs" />
@ -141,13 +142,14 @@
<Compile Include="Framework\SContentManager.cs" /> <Compile Include="Framework\SContentManager.cs" />
<Compile Include="Framework\Serialisation\JsonHelper.cs" /> <Compile Include="Framework\Serialisation\JsonHelper.cs" />
<Compile Include="Framework\Serialisation\SelectiveStringEnumConverter.cs" /> <Compile Include="Framework\Serialisation\SelectiveStringEnumConverter.cs" />
<Compile Include="Framework\Serialisation\SemanticVersionConverter.cs" /> <Compile Include="Framework\Serialisation\ManifestFieldConverter.cs" />
<Compile Include="ICommandHelper.cs" /> <Compile Include="ICommandHelper.cs" />
<Compile Include="IContentEventData.cs" /> <Compile Include="IContentEventData.cs" />
<Compile Include="IContentEventHelper.cs" /> <Compile Include="IContentEventHelper.cs" />
<Compile Include="IContentEventHelperForDictionary.cs" /> <Compile Include="IContentEventHelperForDictionary.cs" />
<Compile Include="IContentEventHelperForImage.cs" /> <Compile Include="IContentEventHelperForImage.cs" />
<Compile Include="IContentHelper.cs" /> <Compile Include="IContentHelper.cs" />
<Compile Include="IManifestDependency.cs" />
<Compile Include="IModRegistry.cs" /> <Compile Include="IModRegistry.cs" />
<Compile Include="Events\LocationEvents.cs" /> <Compile Include="Events\LocationEvents.cs" />
<Compile Include="Events\MenuEvents.cs" /> <Compile Include="Events\MenuEvents.cs" />