using System.Linq;
namespace StardewModdingAPI.Framework.ModData
{
/// A versioned mod metadata field.
internal class ModDataField
{
/*********
** Accessors
*********/
/// The field key.
public ModDataFieldKey Key { get; }
/// The field value.
public string Value { get; }
/// Whether this field should only be applied if it's not already set.
public bool IsDefault { get; }
/// The lowest version in the range, or null for all past versions.
public ISemanticVersion LowerVersion { get; }
/// The highest version in the range, or null for all future versions.
public ISemanticVersion UpperVersion { get; }
/*********
** Public methods
*********/
/// Construct an instance.
/// The field key.
/// The field value.
/// Whether this field should only be applied if it's not already set.
/// The lowest version in the range, or null for all past versions.
/// The highest version in the range, or null for all future versions.
public ModDataField(ModDataFieldKey key, string value, bool isDefault, ISemanticVersion lowerVersion, ISemanticVersion upperVersion)
{
this.Key = key;
this.Value = value;
this.IsDefault = isDefault;
this.LowerVersion = lowerVersion;
this.UpperVersion = upperVersion;
}
/// Get whether this data field applies for the given manifest.
/// The mod manifest.
public bool IsMatch(IManifest manifest)
{
return
manifest?.Version != null // ignore invalid manifest
&& (!this.IsDefault || !this.HasFieldValue(manifest, this.Key))
&& (this.LowerVersion == null || !manifest.Version.IsOlderThan(this.LowerVersion))
&& (this.UpperVersion == null || !manifest.Version.IsNewerThan(this.UpperVersion));
}
/*********
** Private methods
*********/
/// Get whether a manifest field has a meaningful value for the purposes of enforcing .
/// The mod manifest.
/// The field key matching .
private bool HasFieldValue(IManifest manifest, ModDataFieldKey key)
{
switch (key)
{
// update key
case ModDataFieldKey.UpdateKey:
return manifest.UpdateKeys != null && manifest.UpdateKeys.Any(p => !string.IsNullOrWhiteSpace(p));
// non-manifest fields
case ModDataFieldKey.AlternativeUrl:
case ModDataFieldKey.StatusReasonPhrase:
case ModDataFieldKey.Status:
return false;
default:
return false;
}
}
}
}