using System;
namespace StardewModdingAPI.Framework.Content
{
/// Base implementation for a content helper which encapsulates access and changes to content being read from a data file.
/// The interface value type.
internal class AssetData : AssetInfo, IAssetData
where TValue : notnull
{
/*********
** Fields
*********/
/// A callback to invoke when the data is replaced (if any).
private readonly Action? OnDataReplaced;
/*********
** Accessors
*********/
///
public TValue Data { get; protected set; }
/*********
** Public methods
*********/
/// Construct an instance.
/// The content's locale code, if the content is localized.
/// The asset name being read.
/// The content data being read.
/// Normalizes an asset key to match the cache key.
/// A callback to invoke when the data is replaced (if any).
public AssetData(string? locale, IAssetName assetName, TValue data, Func getNormalizedPath, Action? onDataReplaced)
: base(locale, assetName, data.GetType(), getNormalizedPath)
{
this.Data = data;
this.OnDataReplaced = onDataReplaced;
}
///
public void ReplaceWith(TValue value)
{
if (value == null)
throw new ArgumentNullException(nameof(value), "Can't set a loaded asset to a null value.");
if (!this.DataType.IsInstanceOfType(value))
throw new InvalidCastException($"Can't replace loaded asset of type {this.GetFriendlyTypeName(this.DataType)} with value of type {this.GetFriendlyTypeName(value.GetType())}. The new type must be compatible to prevent game errors.");
this.Data = value;
this.OnDataReplaced?.Invoke(value);
}
}
}