using System; using System.Collections.Generic; namespace InABox.Core { public abstract class LookupGenerator : ILookupGenerator { private readonly List> columns = new List>(); private readonly List entries = new List(); public LookupGenerator(T[]? items) { Items = items; } /// /// Null is synonymous with an empty list. /// public T[]? Items { get; set; } public event GenerateLookupsHandler? OnBeforeGenerateLookups; public event GenerateLookupsHandler? OnAfterGenerateLookups; public CoreTable AsTable(string colname) { var result = new CoreTable(); result.Columns.Add(new CoreColumn { ColumnName = colname, DataType = typeof(object) }); result.Columns.Add(new CoreColumn { ColumnName = "Display", DataType = typeof(string) }); foreach (var column in columns) result.Columns.Add(new CoreColumn { ColumnName = column.Item1, DataType = column.Item2 }); GenerateLookups(); foreach (var entry in entries) { var row = result.NewRow(); row[colname] = entry.Key; row["Display"] = entry.Display; for (var i = 0; i < columns.Count; i++) row[columns[i].Item1] = entry.Values[i]; result.Rows.Add(row); } return result; } private void GenerateLookups() { OnBeforeGenerateLookups?.Invoke(this, entries); DoGenerateLookups(); OnAfterGenerateLookups?.Invoke(this, entries); } protected virtual void DoGenerateLookups() { } protected void Clear() { entries.Clear(); } protected LookupEntry AddValue(object key, string display, params object[] values) { if (values.Length != columns.Count) throw new Exception("Incorrect # of values in " + GetType().Name); var result = new LookupEntry(key, display, values); entries.Add(result); return result; } protected void AddColumn(string name, Type type) { columns.Add(new Tuple(name, type)); } } }