using System; using System.Collections.Generic; using Scriban.Runtime; using Scriban.Syntax; namespace Kalk.Core { public sealed class KalkShortcutKeySequence : ScriptObject { public KalkShortcutKeySequence(IEnumerable keys, ScriptExpression expression) { if (keys == null) throw new ArgumentNullException(nameof(keys)); Keys = new List(keys); Expression = expression ?? throw new ArgumentNullException(nameof(expression)); var readonlyKeys = new ScriptArray(Keys) {IsReadOnly = true}; SetValue("keys", readonlyKeys, true); SetValue("expression", Expression.ToString(), true); IsReadOnly = true; } public new List Keys { get; } public ScriptExpression Expression { get; } public static List Parse(ScriptExpression keys, ScriptExpression expression) { if (keys == null) throw new ArgumentNullException(nameof(keys)); var keyAsString = keys is ScriptLiteral literal && literal.Value is string strValue? strValue : keys.ToString(); var keySequencesAsText = keyAsString.Split(',', StringSplitOptions.RemoveEmptyEntries); var keySequences = new List(); foreach (var keySequence in keySequencesAsText) { var keyList = keySequence.Split(' ', StringSplitOptions.RemoveEmptyEntries); var resultKeys = new List(); foreach (var keyText in keyList) { try { var key = KalkConsoleKey.Parse(keyText); resultKeys.Add(key); } catch (Exception ex) { throw new ScriptRuntimeException(keys.Span, $"Unable to parse key. Reason: {ex.Message}"); } } keySequences.Add(new KalkShortcutKeySequence(resultKeys, expression)); } return keySequences; } } }