using System.Reflection; using T3.Core.DataTypes; using T3.Core.Logging; using T3.Core.Operator; using T3.Core.Operator.Slots; namespace T3.Core.Utils; // Todo: can this be removed? public class StructuredListUtils { public static T GetValueOfFieldWithType(EvaluationContext context, InputSlot dataListInput, InputSlot itemIndex, InputSlot FieldIndex, InputSlot orFieldName, ref FieldInfo fieldRef) { var list = dataListInput.GetValue(context); if (list == null || list.NumElements == 0) return default; var index = itemIndex.GetValue(context) % list.NumElements; var item = list[index]; var fieldInfos = list.Type.GetFields(); var needToUpdateIndex = FieldIndex.DirtyFlag.IsDirty || orFieldName.DirtyFlag.IsDirty; if (needToUpdateIndex) { var requestedFieldIndex = FieldIndex.GetValue(context); var requestedFieldName = orFieldName.GetValue(context); fieldRef = null; var fieldIndex = 0; foreach (var field in fieldInfos) { if (fieldIndex == requestedFieldIndex || field.Name == requestedFieldName) { if (field.GetValue(item) is T f) { fieldRef = field; return f; } } fieldIndex++; } Log.Warning($"There is not Float field for index {requestedFieldIndex} or name '{requestedFieldName}' in type {list.Type.Name}"); } else if (fieldRef?.GetValue(item) is T f) { return f; } return default; } public static T GetIteratedValueOfFieldWithType(EvaluationContext context, InputSlot orFieldName, ref FieldInfo fieldRef) { var list = context.IteratedList; if (list == null || list.NumElements == 0) return default; var index = context.IteratedListIndex % list.NumElements; // TODO: Clarify if default Modulo is a good choice var item = list[index]; var fieldInfos = list.Type.GetFields(); if (orFieldName.DirtyFlag.IsDirty) { var requestedFieldName = orFieldName.GetValue(context); fieldRef = null; foreach (var field in fieldInfos) { if (field.Name == requestedFieldName) { if (field.GetValue(item) is T f) { fieldRef = field; return f; } } } Log.Warning($"There is not Float field for name '{requestedFieldName}' in type {list.Type.Name}"); } else if (fieldRef?.GetValue(item) is T f) { return f; } return default; } }