using System;
using Scriban.Runtime;
namespace Kalk.Core
{
///
/// An action object returned by and used when evaluating shortcuts.
///
public class KalkActionObject : ScriptObject
{
public KalkActionObject(string action)
{
Action = action ?? throw new ArgumentNullException(nameof(action));
}
public string Action
{
get => GetSafeValue("action");
set => SetValue("action", value, false);
}
public void Call(Action run)
{
var action = Action;
if (action == null) return;
switch (action)
{
case "cursor_left":
run(KalkAction.CursorLeft);
break;
case "cursor_right":
run(KalkAction.CursorRight);
break;
case "history_previous":
run(KalkAction.HistoryPrevious);
break;
case "history_next":
run(KalkAction.HistoryNext);
break;
case "copy":
run(KalkAction.CopySelection);
break;
case "cut":
run(KalkAction.CutSelection);
break;
case "paste":
run(KalkAction.PasteClipboard);
break;
case "cursor_word_left":
run(KalkAction.CursorLeftWord);
break;
case "cursor_word_right":
run(KalkAction.CursorRightWord);
break;
case "cursor_line_start":
run(KalkAction.CursorStartOfLine);
break;
case "cursor_line_end":
run(KalkAction.CursorEndOfLine);
break;
case "completion":
run(KalkAction.Completion);
break;
case "delete_left":
run(KalkAction.DeleteCharacterLeft);
break;
case "delete_right":
run(KalkAction.DeleteCharacterRight);
break;
case "delete_word_left":
run(KalkAction.DeleteWordLeft);
break;
case "delete_word_right":
run(KalkAction.DeleteWordRight);
break;
case "validate_line":
run(KalkAction.ValidateLine);
break;
case "force_validate_line":
run(KalkAction.ForceValidateLine);
break;
case "exit":
run(KalkAction.Exit);
break;
default:
throw new ArgumentException($"Action `{action}` is not supported", nameof(action));
}
}
}
}