module Ribosome.Plugin.Builtin where

import Data.MessagePack (Object(ObjectString, ObjectNil))
import Neovim.Plugin.Classes (Synchronous(Async))

import Ribosome.Control.Monad.Ribo (MonadRibo, NvimE)
import Ribosome.Data.Text (capitalize)
import Ribosome.Plugin.TH.Handler (RpcDef(RpcDef), RpcDefDetail(RpcFunction))
import Ribosome.Scratch (killScratchByName)

deleteScratch ::
  MonadRibo m =>
  NvimE e m =>
  [Object] ->
  m Object
deleteScratch :: [Object] -> m Object
deleteScratch [ObjectString name] = do
  Object
ObjectNil Object -> m () -> m Object
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Text -> m ()
forall (m :: * -> *) e. (MonadRibo m, NvimE e m) => Text -> m ()
killScratchByName (ByteString -> Text
forall a b. ConvertUtf8 a b => b -> a
decodeUtf8 ByteString
name)
deleteScratch [Object]
_ =
  Object -> m Object
forall (m :: * -> *) a. Monad m => a -> m a
return Object
ObjectNil

deleteScratchRpc ::
  MonadRibo m =>
  NvimE e m =>
  Text ->
  RpcDef m
deleteScratchRpc :: Text -> RpcDef m
deleteScratchRpc Text
pluginName =
  RpcDefDetail -> Text -> ([Object] -> m Object) -> RpcDef m
forall (m :: * -> *).
RpcDefDetail -> Text -> ([Object] -> m Object) -> RpcDef m
RpcDef (Synchronous -> RpcDefDetail
RpcFunction Synchronous
Async) (Text -> Text
capitalize Text
pluginName Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
"DeleteScratch") [Object] -> m Object
forall (m :: * -> *) e.
(MonadRibo m, NvimE e m) =>
[Object] -> m Object
deleteScratch