summaryrefslogtreecommitdiff
path: root/src/SMAPI.Toolkit/Framework/ModData
diff options
context:
space:
mode:
Diffstat (limited to 'src/SMAPI.Toolkit/Framework/ModData')
-rw-r--r--src/SMAPI.Toolkit/Framework/ModData/MetadataModel.cs4
-rw-r--r--src/SMAPI.Toolkit/Framework/ModData/ModDataField.cs10
-rw-r--r--src/SMAPI.Toolkit/Framework/ModData/ModDataModel.cs32
-rw-r--r--src/SMAPI.Toolkit/Framework/ModData/ModDataRecord.cs12
-rw-r--r--src/SMAPI.Toolkit/Framework/ModData/ModDataRecordVersionedFields.cs28
-rw-r--r--src/SMAPI.Toolkit/Framework/ModData/ModDatabase.cs14
6 files changed, 52 insertions, 48 deletions
diff --git a/src/SMAPI.Toolkit/Framework/ModData/MetadataModel.cs b/src/SMAPI.Toolkit/Framework/ModData/MetadataModel.cs
index 3fa70615..da678ac9 100644
--- a/src/SMAPI.Toolkit/Framework/ModData/MetadataModel.cs
+++ b/src/SMAPI.Toolkit/Framework/ModData/MetadataModel.cs
@@ -1,5 +1,3 @@
-#nullable disable
-
using System.Collections.Generic;
namespace StardewModdingAPI.Toolkit.Framework.ModData
@@ -11,6 +9,6 @@ namespace StardewModdingAPI.Toolkit.Framework.ModData
** Accessors
********/
/// <summary>Extra metadata about mods.</summary>
- public IDictionary<string, ModDataModel> ModData { get; set; }
+ public IDictionary<string, ModDataModel> ModData { get; } = new Dictionary<string, ModDataModel>();
}
}
diff --git a/src/SMAPI.Toolkit/Framework/ModData/ModDataField.cs b/src/SMAPI.Toolkit/Framework/ModData/ModDataField.cs
index 46cb81e1..9674d283 100644
--- a/src/SMAPI.Toolkit/Framework/ModData/ModDataField.cs
+++ b/src/SMAPI.Toolkit/Framework/ModData/ModDataField.cs
@@ -1,5 +1,3 @@
-#nullable disable
-
using System.Linq;
namespace StardewModdingAPI.Toolkit.Framework.ModData
@@ -20,10 +18,10 @@ namespace StardewModdingAPI.Toolkit.Framework.ModData
public bool IsDefault { get; }
/// <summary>The lowest version in the range, or <c>null</c> for all past versions.</summary>
- public ISemanticVersion LowerVersion { get; }
+ public ISemanticVersion? LowerVersion { get; }
/// <summary>The highest version in the range, or <c>null</c> for all future versions.</summary>
- public ISemanticVersion UpperVersion { get; }
+ public ISemanticVersion? UpperVersion { get; }
/*********
@@ -35,7 +33,7 @@ namespace StardewModdingAPI.Toolkit.Framework.ModData
/// <param name="isDefault">Whether this field should only be applied if it's not already set.</param>
/// <param name="lowerVersion">The lowest version in the range, or <c>null</c> for all past versions.</param>
/// <param name="upperVersion">The highest version in the range, or <c>null</c> for all future versions.</param>
- public ModDataField(ModDataFieldKey key, string value, bool isDefault, ISemanticVersion lowerVersion, ISemanticVersion upperVersion)
+ public ModDataField(ModDataFieldKey key, string value, bool isDefault, ISemanticVersion? lowerVersion, ISemanticVersion? upperVersion)
{
this.Key = key;
this.Value = value;
@@ -46,7 +44,7 @@ namespace StardewModdingAPI.Toolkit.Framework.ModData
/// <summary>Get whether this data field applies for the given manifest.</summary>
/// <param name="manifest">The mod manifest.</param>
- public bool IsMatch(IManifest manifest)
+ public bool IsMatch(IManifest? manifest)
{
return
manifest?.Version != null // ignore invalid manifest
diff --git a/src/SMAPI.Toolkit/Framework/ModData/ModDataModel.cs b/src/SMAPI.Toolkit/Framework/ModData/ModDataModel.cs
index 4d96a555..5912fb87 100644
--- a/src/SMAPI.Toolkit/Framework/ModData/ModDataModel.cs
+++ b/src/SMAPI.Toolkit/Framework/ModData/ModDataModel.cs
@@ -1,5 +1,3 @@
-#nullable disable
-
using System;
using System.Collections.Generic;
using System.Linq;
@@ -16,7 +14,7 @@ namespace StardewModdingAPI.Toolkit.Framework.ModData
** Accessors
*********/
/// <summary>The mod's current unique ID.</summary>
- public string ID { get; set; }
+ public string ID { get; }
/// <summary>The former mod IDs (if any).</summary>
/// <remarks>
@@ -25,14 +23,14 @@ namespace StardewModdingAPI.Toolkit.Framework.ModData
/// ID, if any. If the mod's ID changed over time, multiple variants can be separated by the
/// <c>|</c> character.
/// </remarks>
- public string FormerIDs { get; set; }
+ public string? FormerIDs { get; }
/// <summary>The mod warnings to suppress, even if they'd normally be shown.</summary>
- public ModWarning SuppressWarnings { get; set; }
+ public ModWarning SuppressWarnings { get; }
/// <summary>This field stores properties that aren't mapped to another field before they're parsed into <see cref="Fields"/>.</summary>
[JsonExtensionData]
- public IDictionary<string, JToken> ExtensionData { get; set; }
+ public IDictionary<string, JToken> ExtensionData { get; } = new Dictionary<string, JToken>();
/// <summary>The versioned field data.</summary>
/// <remarks>
@@ -52,6 +50,17 @@ namespace StardewModdingAPI.Toolkit.Framework.ModData
/*********
** Public methods
*********/
+ /// <summary>Construct an instance.</summary>
+ /// <param name="id">The mod's current unique ID.</param>
+ /// <param name="formerIds">The former mod IDs (if any).</param>
+ /// <param name="suppressWarnings">The mod warnings to suppress, even if they'd normally be shown.</param>
+ public ModDataModel(string id, string? formerIds, ModWarning suppressWarnings)
+ {
+ this.ID = id;
+ this.FormerIDs = formerIds;
+ this.SuppressWarnings = suppressWarnings;
+ }
+
/// <summary>Get a parsed representation of the <see cref="Fields"/>.</summary>
public IEnumerable<ModDataField> GetFields()
{
@@ -61,8 +70,8 @@ namespace StardewModdingAPI.Toolkit.Framework.ModData
string packedKey = pair.Key;
string value = pair.Value;
bool isDefault = false;
- ISemanticVersion lowerVersion = null;
- ISemanticVersion upperVersion = null;
+ ISemanticVersion? lowerVersion = null;
+ ISemanticVersion? upperVersion = null;
// parse
string[] parts = packedKey.Split('|').Select(p => p.Trim()).ToArray();
@@ -113,11 +122,8 @@ namespace StardewModdingAPI.Toolkit.Framework.ModData
[OnDeserialized]
private void OnDeserialized(StreamingContext context)
{
- if (this.ExtensionData != null)
- {
- this.Fields = this.ExtensionData.ToDictionary(p => p.Key, p => p.Value.ToString());
- this.ExtensionData = null;
- }
+ this.Fields = this.ExtensionData.ToDictionary(p => p.Key, p => p.Value.ToString());
+ this.ExtensionData.Clear();
}
}
}
diff --git a/src/SMAPI.Toolkit/Framework/ModData/ModDataRecord.cs b/src/SMAPI.Toolkit/Framework/ModData/ModDataRecord.cs
index 4c09e1ba..ab0e4377 100644
--- a/src/SMAPI.Toolkit/Framework/ModData/ModDataRecord.cs
+++ b/src/SMAPI.Toolkit/Framework/ModData/ModDataRecord.cs
@@ -1,5 +1,3 @@
-#nullable disable
-
using System;
using System.Collections.Generic;
using System.Linq;
@@ -22,7 +20,7 @@ namespace StardewModdingAPI.Toolkit.Framework.ModData
public string[] FormerIDs { get; }
/// <summary>The mod warnings to suppress, even if they'd normally be shown.</summary>
- public ModWarning SuppressWarnings { get; set; }
+ public ModWarning SuppressWarnings { get; }
/// <summary>The versioned field data.</summary>
public ModDataField[] Fields { get; }
@@ -72,9 +70,9 @@ namespace StardewModdingAPI.Toolkit.Framework.ModData
}
/// <summary>Get the default update key for this mod, if any.</summary>
- public string GetDefaultUpdateKey()
+ public string? GetDefaultUpdateKey()
{
- string updateKey = this.Fields.FirstOrDefault(p => p.Key == ModDataFieldKey.UpdateKey && p.IsDefault)?.Value;
+ string? updateKey = this.Fields.FirstOrDefault(p => p.Key == ModDataFieldKey.UpdateKey && p.IsDefault)?.Value;
return !string.IsNullOrWhiteSpace(updateKey)
? updateKey
: null;
@@ -82,9 +80,9 @@ namespace StardewModdingAPI.Toolkit.Framework.ModData
/// <summary>Get a parsed representation of the <see cref="ModDataRecord.Fields"/> which match a given manifest.</summary>
/// <param name="manifest">The manifest to match.</param>
- public ModDataRecordVersionedFields GetVersionedFields(IManifest manifest)
+ public ModDataRecordVersionedFields GetVersionedFields(IManifest? manifest)
{
- ModDataRecordVersionedFields parsed = new() { DisplayName = this.DisplayName, DataRecord = this };
+ ModDataRecordVersionedFields parsed = new(this);
foreach (ModDataField field in this.Fields.Where(field => field.IsMatch(manifest)))
{
switch (field.Key)
diff --git a/src/SMAPI.Toolkit/Framework/ModData/ModDataRecordVersionedFields.cs b/src/SMAPI.Toolkit/Framework/ModData/ModDataRecordVersionedFields.cs
index b599b343..65fa424e 100644
--- a/src/SMAPI.Toolkit/Framework/ModData/ModDataRecordVersionedFields.cs
+++ b/src/SMAPI.Toolkit/Framework/ModData/ModDataRecordVersionedFields.cs
@@ -1,5 +1,3 @@
-#nullable disable
-
namespace StardewModdingAPI.Toolkit.Framework.ModData
{
/// <summary>The versioned fields from a <see cref="ModDataRecord"/> for a specific manifest.</summary>
@@ -9,24 +7,32 @@ namespace StardewModdingAPI.Toolkit.Framework.ModData
** Accessors
*********/
/// <summary>The underlying data record.</summary>
- public ModDataRecord DataRecord { get; set; }
-
- /// <summary>The default mod name to display when the name isn't available (e.g. during dependency checks).</summary>
- public string DisplayName { get; set; }
+ public ModDataRecord DataRecord { get; }
- /// <summary>The update key to apply.</summary>
- public string UpdateKey { get; set; }
+ /// <summary>The update key to apply (if any).</summary>
+ public string? UpdateKey { get; set; }
/// <summary>The predefined compatibility status.</summary>
public ModStatus Status { get; set; } = ModStatus.None;
/// <summary>A reason phrase for the <see cref="Status"/>, or <c>null</c> to use the default reason.</summary>
- public string StatusReasonPhrase { get; set; }
+ public string? StatusReasonPhrase { get; set; }
/// <summary>Technical details shown in TRACE logs for the <see cref="Status"/>, or <c>null</c> to omit it.</summary>
- public string StatusReasonDetails { get; set; }
+ public string? StatusReasonDetails { get; set; }
/// <summary>The upper version for which the <see cref="Status"/> applies (if any).</summary>
- public ISemanticVersion StatusUpperVersion { get; set; }
+ public ISemanticVersion? StatusUpperVersion { get; set; }
+
+
+ /*********
+ ** Public methods
+ *********/
+ /// <summary>Construct an instance.</summary>
+ /// <param name="dataRecord">The underlying data record.</param>
+ public ModDataRecordVersionedFields(ModDataRecord dataRecord)
+ {
+ this.DataRecord = dataRecord;
+ }
}
}
diff --git a/src/SMAPI.Toolkit/Framework/ModData/ModDatabase.cs b/src/SMAPI.Toolkit/Framework/ModData/ModDatabase.cs
index a5237334..168b8aac 100644
--- a/src/SMAPI.Toolkit/Framework/ModData/ModDatabase.cs
+++ b/src/SMAPI.Toolkit/Framework/ModData/ModDatabase.cs
@@ -1,5 +1,3 @@
-#nullable disable
-
using System;
using System.Collections.Generic;
using System.Linq;
@@ -16,7 +14,7 @@ namespace StardewModdingAPI.Toolkit.Framework.ModData
private readonly ModDataRecord[] Records;
/// <summary>Get an update URL for an update key (if valid).</summary>
- private readonly Func<string, string> GetUpdateUrl;
+ private readonly Func<string, string?> GetUpdateUrl;
/*********
@@ -29,7 +27,7 @@ namespace StardewModdingAPI.Toolkit.Framework.ModData
/// <summary>Construct an instance.</summary>
/// <param name="records">The underlying mod data records indexed by default display name.</param>
/// <param name="getUpdateUrl">Get an update URL for an update key (if valid).</param>
- public ModDatabase(IEnumerable<ModDataRecord> records, Func<string, string> getUpdateUrl)
+ public ModDatabase(IEnumerable<ModDataRecord> records, Func<string, string?> getUpdateUrl)
{
this.Records = records.ToArray();
this.GetUpdateUrl = getUpdateUrl;
@@ -43,7 +41,7 @@ namespace StardewModdingAPI.Toolkit.Framework.ModData
/// <summary>Get a mod data record.</summary>
/// <param name="modID">The unique mod ID.</param>
- public ModDataRecord Get(string modID)
+ public ModDataRecord? Get(string? modID)
{
return !string.IsNullOrWhiteSpace(modID)
? this.Records.FirstOrDefault(p => p.HasID(modID))
@@ -52,11 +50,11 @@ namespace StardewModdingAPI.Toolkit.Framework.ModData
/// <summary>Get the mod page URL for a mod (if available).</summary>
/// <param name="id">The unique mod ID.</param>
- public string GetModPageUrlFor(string id)
+ public string? GetModPageUrlFor(string? id)
{
// get update key
- ModDataRecord record = this.Get(id);
- ModDataField updateKeyField = record?.Fields.FirstOrDefault(p => p.Key == ModDataFieldKey.UpdateKey);
+ ModDataRecord? record = this.Get(id);
+ ModDataField? updateKeyField = record?.Fields.FirstOrDefault(p => p.Key == ModDataFieldKey.UpdateKey);
if (updateKeyField == null)
return null;