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

import Data.ByteString.UTF8
import Neovim

nvimFatal :: Either NeovimException a -> Neovim env a
nvimFatal (Right a) = return a
nvimFatal (Left e) = (liftIO . fail . show) e

nvimResponseString :: Object -> Neovim env String
nvimResponseString (ObjectString a) = return $ toString a
nvimResponseString a = liftIO . fail $ "invalid nvim type for String: " ++ (show a)

nvimResponseStringArray :: Object -> Neovim env [String]
nvimResponseStringArray (ObjectArray a) = traverse nvimResponseString a
nvimResponseStringArray a = liftIO . fail $ "invalid nvim type for Array: " ++ (show a)

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