diff --git a/src/ffi/lua/ext/callback.rs b/src/ffi/lua/ext/callback.rs index dd84098..ce96c31 100644 --- a/src/ffi/lua/ext/callback.rs +++ b/src/ffi/lua/ext/callback.rs @@ -62,55 +62,53 @@ pub(crate) enum LuaCallback { Invoke(LuaFunction, CallbackArg), } -pub(crate) enum CallbackArg { - Nil, - Str(String), - VecStr(Vec), - Client(CodempClient), - CursorController(CodempCursorController), - BufferController(CodempBufferController), - Workspace(CodempWorkspace), - Event(CodempEvent), - MaybeEvent(Option), - Cursor(CodempCursor), - MaybeCursor(Option), - TextChange(CodempTextChange), - MaybeTextChange(Option), -} - -impl IntoLua for CallbackArg { - // TODO this basically calls .into_lua() on all enum variants - // i wish i could do this with a Box or an impl IntoLua - // but IntoLua requires Sized so it can't be made into an object - fn into_lua(self, lua: &Lua) -> LuaResult { - match self { - CallbackArg::Nil => Ok(LuaValue::Nil), - CallbackArg::Str(x) => x.into_lua(lua), - CallbackArg::Client(x) => x.into_lua(lua), - CallbackArg::CursorController(x) => x.into_lua(lua), - CallbackArg::BufferController(x) => x.into_lua(lua), - CallbackArg::Workspace(x) => x.into_lua(lua), - CallbackArg::VecStr(x) => x.into_lua(lua), - CallbackArg::Event(x) => x.into_lua(lua), - CallbackArg::MaybeEvent(x) => x.into_lua(lua), - CallbackArg::Cursor(x) => x.into_lua(lua), - CallbackArg::MaybeCursor(x) => x.into_lua(lua), - CallbackArg::TextChange(x) => x.into_lua(lua), - CallbackArg::MaybeTextChange(x) => x.into_lua(lua), +macro_rules! callback_args { + ($($name:ident : $t:ty ,)*) => { + pub(crate) enum CallbackArg { + Nil, + $( + $name($t), + )* } - } + + impl IntoLua for CallbackArg { + fn into_lua(self, lua: &Lua) -> LuaResult { + match self { + Self::Nil => Ok(LuaValue::Nil), + $( + Self::$name(x) => x.into_lua(lua), + )* + } + } + } + + impl From<()> for CallbackArg { + fn from(_value: ()) -> Self { + Self::Nil + } + } + + $( + impl From<$t> for CallbackArg { + fn from(value: $t) -> Self { + Self::$name(value) + } + } + )* + }; } -impl From<()> for CallbackArg { fn from(_: ()) -> Self { CallbackArg::Nil } } -impl From for CallbackArg { fn from(value: String) -> Self { CallbackArg::Str(value) } } -impl From for CallbackArg { fn from(value: CodempClient) -> Self { CallbackArg::Client(value) } } -impl From for CallbackArg { fn from(value: CodempCursorController) -> Self { CallbackArg::CursorController(value) } } -impl From for CallbackArg { fn from(value: CodempBufferController) -> Self { CallbackArg::BufferController(value) } } -impl From for CallbackArg { fn from(value: CodempWorkspace) -> Self { CallbackArg::Workspace(value) } } -impl From> for CallbackArg { fn from(value: Vec) -> Self { CallbackArg::VecStr(value) } } -impl From for CallbackArg { fn from(value: CodempEvent) -> Self { CallbackArg::Event(value) } } -impl From for CallbackArg { fn from(value: CodempCursor) -> Self { CallbackArg::Cursor(value) } } -impl From> for CallbackArg { fn from(value: Option) -> Self { CallbackArg::MaybeCursor(value) } } -impl From for CallbackArg { fn from(value: CodempTextChange) -> Self { CallbackArg::TextChange(value) } } -impl From> for CallbackArg { fn from(value: Option) -> Self { CallbackArg::MaybeTextChange(value) } } -impl From> for CallbackArg { fn from(value: Option) -> Self { CallbackArg::MaybeEvent(value) } } +callback_args! { + Str: String, + VecStr: Vec, + Client: CodempClient, + CursorController: CodempCursorController, + BufferController: CodempBufferController, + Workspace: CodempWorkspace, + Event: CodempEvent, + MaybeEvent: Option, + Cursor: CodempCursor, + MaybeCursor: Option, + TextChange: CodempTextChange, + MaybeTextChange: Option, +}