using System.Collections;
using Robust.Shared.Prototypes;
using Robust.Shared.Serialization;
namespace Content.Shared.Dataset;
///
/// A variant of intended to specify a sequence of LocId strings
/// without having to copy-paste a ton of LocId strings into the YAML.
///
[Prototype]
public sealed partial class LocalizedDatasetPrototype : IPrototype
{
///
/// Identifier for this prototype.
///
[ViewVariables]
[IdDataField]
public string ID { get; private set; } = default!;
///
/// Collection of LocId strings.
///
[DataField]
public LocalizedDatasetValues Values { get; private set; } = [];
}
[Serializable, NetSerializable]
[DataDefinition]
public sealed partial class LocalizedDatasetValues : IReadOnlyList
{
///
/// String prepended to the index number to generate each LocId string.
/// For example, a prefix of tips-dataset- will generate tips-dataset-1,
/// tips-dataset-2, etc.
///
[DataField(required: true)]
public string Prefix { get; private set; } = default!;
///
/// How many values are in the dataset.
///
[DataField(required: true)]
public int Count { get; private set; }
public string this[int index]
{
get
{
if (index > Count || index < 0)
throw new IndexOutOfRangeException();
return Prefix + index;
}
}
public IEnumerator GetEnumerator()
{
return new Enumerator(this);
}
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
public sealed class Enumerator : IEnumerator
{
private int _index = 0; // Whee, 1-indexing
private readonly LocalizedDatasetValues _values;
public Enumerator(LocalizedDatasetValues values)
{
_values = values;
}
public string Current => _values.Prefix + _index;
object IEnumerator.Current => Current;
public void Dispose() { }
public bool MoveNext()
{
_index++;
return _index <= _values.Count;
}
public void Reset()
{
_index = 0;
}
}
}