using System; using UnityEngine.Localization.Settings; using UnityEngine.Localization.SmartFormat.Core.Extensions; using UnityEngine.Localization.SmartFormat.Core.Formatting; using UnityEngine.Localization.SmartFormat.Utilities; namespace UnityEngine.Localization.SmartFormat.Extensions { /// /// Provides the ability to iterate through a [Tuple](https://docs.microsoft.com/en-us/dotnet/api/system.tuple-7?view=net-5.0) values. /// [Serializable] public class ValueTupleSource : ISource { SmartFormatter m_Formatter; /// /// Creates a new instance of the source. /// /// public ValueTupleSource(SmartFormatter formatter) { m_Formatter = formatter; } /// public bool TryEvaluateSelector(ISelectorInfo selectorInfo) { if (!(selectorInfo is FormattingInfo formattingInfo)) return false; if (!(formattingInfo.CurrentValue != null && formattingInfo.CurrentValue.IsValueTuple())) return false; var savedCurrentValue = formattingInfo.CurrentValue; foreach (var obj in formattingInfo.CurrentValue.GetValueTupleItemObjectsFlattened()) { var formatter = m_Formatter ?? LocalizationSettings.StringDatabase.SmartFormatter; foreach (var sourceExtension in m_Formatter.SourceExtensions) { formattingInfo.CurrentValue = obj; var handled = sourceExtension.TryEvaluateSelector(formattingInfo); if (handled) { formattingInfo.CurrentValue = savedCurrentValue; return true; } } } formattingInfo.CurrentValue = savedCurrentValue; return false; } } }