module Ribosome.Api.Response(
  nvimFatal,
  nvimResponseString,
  nvimResponseStringArray,
  nvimValidateFatal,
)
where

import Neovim

nvimFatal :: Either NeovimException a -> Neovim env a
nvimFatal :: Either NeovimException a -> Neovim env a
nvimFatal (Right a
a) = a -> Neovim env a
forall (m :: * -> *) a. Monad m => a -> m a
return a
a
nvimFatal (Left NeovimException
e) = (IO a -> Neovim env a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO a -> Neovim env a)
-> (NeovimException -> IO a) -> NeovimException -> Neovim env a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> IO a
forall (m :: * -> *) a. MonadFail m => String -> m a
fail (String -> IO a)
-> (NeovimException -> String) -> NeovimException -> IO a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. NeovimException -> String
forall b a. (Show a, IsString b) => a -> b
show) NeovimException
e

nvimResponseString :: Object -> Neovim env Text
nvimResponseString :: Object -> Neovim env Text
nvimResponseString (ObjectString ByteString
a) = Text -> Neovim env Text
forall (m :: * -> *) a. Monad m => a -> m a
return (Text -> Neovim env Text) -> Text -> Neovim env Text
forall a b. (a -> b) -> a -> b
$ ByteString -> Text
forall a b. ConvertUtf8 a b => b -> a
decodeUtf8 ByteString
a
nvimResponseString Object
a = IO Text -> Neovim env Text
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO Text -> Neovim env Text)
-> (String -> IO Text) -> String -> Neovim env Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> IO Text
forall (m :: * -> *) a. MonadFail m => String -> m a
fail (String -> Neovim env Text) -> String -> Neovim env Text
forall a b. (a -> b) -> a -> b
$ String
"invalid nvim type for Text: " String -> String -> String
forall a. Semigroup a => a -> a -> a
<> Object -> String
forall b a. (Show a, IsString b) => a -> b
show Object
a

nvimResponseStringArray :: Object -> Neovim env [Text]
nvimResponseStringArray :: Object -> Neovim env [Text]
nvimResponseStringArray (ObjectArray [Object]
a) = (Object -> Neovim env Text) -> [Object] -> Neovim env [Text]
forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
traverse Object -> Neovim env Text
forall env. Object -> Neovim env Text
nvimResponseString [Object]
a
nvimResponseStringArray Object
a = IO [Text] -> Neovim env [Text]
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO [Text] -> Neovim env [Text])
-> (String -> IO [Text]) -> String -> Neovim env [Text]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> IO [Text]
forall (m :: * -> *) a. MonadFail m => String -> m a
fail (String -> Neovim env [Text]) -> String -> Neovim env [Text]
forall a b. (a -> b) -> a -> b
$ String
"invalid nvim type for Array: " String -> String -> String
forall a. Semigroup a => a -> a -> a
<> Object -> String
forall b a. (Show a, IsString b) => a -> b
show Object
a

nvimValidateFatal :: (Object -> Neovim env a) -> Either NeovimException Object -> Neovim env a
nvimValidateFatal :: (Object -> Neovim env a)
-> Either NeovimException Object -> Neovim env a
nvimValidateFatal Object -> Neovim env a
validate Either NeovimException Object
response = do
  Object
result <- Either NeovimException Object -> Neovim env Object
forall a env. Either NeovimException a -> Neovim env a
nvimFatal Either NeovimException Object
response
  Object -> Neovim env a
validate Object
result