using System; using System.Collections.Generic; using System.Text; namespace StgSharp.Script.Express { public class ExpSwitchToken : ExpToken { private ExpToken _target; private List _default; private Dictionary> _cases; public List this[ExpToken index] { get { if (_cases.TryGetValue(index, out var ret)) { return ret; } return _default; } } public ExpSwitchToken(string name, ExpSchema context, ExpToken target, IEnumerable @default , params (ExpToken label, IEnumerable op)[] cases ) : base(name, context) { _target = target; if (@default == null) { _default = new List(); } else { _default = new List(@default); } _cases = new Dictionary>(); foreach (var item in cases) { if (item.op == null) { _cases.Add(item.label, new List()); } else { _cases.Add(item.label, new List(item.op)); } } } public bool ContainsCase(ExpToken token) { return _cases.ContainsKey(token); } /// /// Adds an expression to certain . /// The added expression will be run at last. /// /// Label of case to add operation /// Root token of the expression to be added. /// Cannot fine the case label in current witch expression. public void AddOperationToCase(ExpToken label, ExpToken expressionRoot) { AssertSchemaInclude(expressionRoot); if (_cases.TryGetValue(label,out var op)) { op.Add(expressionRoot); } else { throw new ExpCaseNotFoundException(this, label); } } public void AddOperationToDefault(ExpToken expressionRoot) { if (expressionRoot != null) { _default.Add(expressionRoot); } } } }