using System;
using Newtonsoft.Json;
namespace StardewModdingAPI.Framework.Models
{
/// Uniquely identifies a mod for compatibility checks.
internal class ModCompatibilityID
{
/*********
** Accessors
*********/
/// The unique mod ID.
public string ID { get; set; }
/// The mod name to disambiguate non-unique IDs, or null to ignore the mod name.
public string Name { get; set; }
/// The author name to disambiguate non-unique IDs, or null to ignore the author.
public string Author { get; set; }
/*********
** Public methods
*********/
/// Construct an instance.
public ModCompatibilityID() { }
/// Construct an instance.
/// The mod ID or a JSON string matching the fields.
public ModCompatibilityID(string data)
{
// JSON can be stuffed into the ID string as a convenience hack to keep JSON mod lists
// formatted readably. The tradeoff is that the format is a bit more magical, but that's
// probably acceptable since players aren't meant to edit it. It's also fairly clear what
// the JSON strings do, if not necessarily how.
if (data.StartsWith("{"))
JsonConvert.PopulateObject(data, this);
else
this.ID = data;
}
/// Get whether this ID matches a given mod manifest.
/// The mod's unique ID, or a substitute ID if it isn't set in the manifest.
/// The manifest to check.
public bool Matches(string id, IManifest manifest)
{
return
this.ID.Equals(id, StringComparison.InvariantCultureIgnoreCase)
&& (
this.Author == null
|| this.Author.Equals(manifest.Author, StringComparison.InvariantCultureIgnoreCase)
|| (manifest.ExtraFields.ContainsKey("Authour") && this.Author.Equals(manifest.ExtraFields["Authour"].ToString(), StringComparison.InvariantCultureIgnoreCase))
)
&& (this.Name == null || this.Name.Equals(manifest.Name, StringComparison.InvariantCultureIgnoreCase));
}
}
}