using NTDLS.Helpers; namespace ZelWiki.Engine.Function { public class FunctionParameters { /// /// Variables set by ordinal. /// public List Ordinals { get; set; } = new(); /// /// Variables set by name. /// public List Named { get; private set; } = new(); private readonly FunctionCall _owner; public FunctionParameters(FunctionCall owner) { _owner = owner; } public T Get(string name) { try { var value = Named.Where(o => o.Name.Equals(name, StringComparison.InvariantCultureIgnoreCase)).FirstOrDefault()?.Value; if (value == null) { var prototype = _owner.Prototype.Parameters.Where(o => o.Name.Equals(name, StringComparison.InvariantCultureIgnoreCase)).First(); return Converters.ConvertTo(prototype.DefaultValue) ?? throw new Exception("Value cannot be null"); } return Converters.ConvertTo(value) ?? throw new Exception("Value cannot be null"); } catch (Exception ex) { throw new Exception($"Function [{_owner.Name}], {ex.Message}"); } } public T Get(string name, T defaultValue) { try { var value = Named.Where(o => o.Name.Equals(name, StringComparison.InvariantCultureIgnoreCase)).FirstOrDefault()?.Value; if (value == null) { return defaultValue; } return Converters.ConvertTo(value) ?? throw new Exception("Value cannot be null"); } catch (Exception ex) { throw new Exception($"Function [{_owner.Name}], {ex.Message}"); } } public List GetList(string name) { try { var values = Named.Where(o => o.Name.Equals(name, StringComparison.InvariantCultureIgnoreCase))? .Select(o => Converters.ConvertTo(o.Value) ?? throw new Exception("Value cannot be null"))?.ToList(); return values ?? new List(); } catch (Exception ex) { throw new Exception($"Function [{_owner.Name}], {ex.Message}"); } } } }