module Ribosome.Internal.NvimObject where

import Data.Map.Strict ((!?))
import Data.Text.Prettyprint.Doc (pretty, (<+>))
import Neovim (AnsiStyle, Doc, NvimObject, Object(ObjectString), fromObject)

deriveString :: (Text -> a) -> Object -> Either (Doc AnsiStyle) a
deriveString :: (Text -> a) -> Object -> Either (Doc AnsiStyle) a
deriveString Text -> a
cons Object
o = (Text -> a)
-> Either (Doc AnsiStyle) Text -> Either (Doc AnsiStyle) a
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Text -> a
cons (Object -> Either (Doc AnsiStyle) Text
forall o. NvimObject o => Object -> Either (Doc AnsiStyle) o
fromObject Object
o :: Either (Doc AnsiStyle) Text)

objectKeyMissing :: Text -> Maybe Object -> Either (Doc AnsiStyle) Object
objectKeyMissing :: Text -> Maybe Object -> Either (Doc AnsiStyle) Object
objectKeyMissing Text
_ (Just Object
o) = Object -> Either (Doc AnsiStyle) Object
forall a b. b -> Either a b
Right Object
o
objectKeyMissing Text
key Maybe Object
Nothing = Doc AnsiStyle -> Either (Doc AnsiStyle) Object
forall a b. a -> Either a b
Left (Text -> Doc AnsiStyle
forall a ann. Pretty a => a -> Doc ann
pretty (Text
"missing key in nvim data:" :: Text) Doc AnsiStyle -> Doc AnsiStyle -> Doc AnsiStyle
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Text -> Doc AnsiStyle
forall a ann. Pretty a => a -> Doc ann
pretty Text
key)

extractObject :: NvimObject o => Text -> Map Object Object -> Either (Doc AnsiStyle) o
extractObject :: Text -> Map Object Object -> Either (Doc AnsiStyle) o
extractObject Text
key Map Object Object
data' = do
  Object
value <- Text -> Maybe Object -> Either (Doc AnsiStyle) Object
objectKeyMissing Text
key (Maybe Object -> Either (Doc AnsiStyle) Object)
-> Maybe Object -> Either (Doc AnsiStyle) Object
forall a b. (a -> b) -> a -> b
$ Map Object Object
data' Map Object Object -> Object -> Maybe Object
forall k a. Ord k => Map k a -> k -> Maybe a
!? (ByteString -> Object
ObjectString (ByteString -> Object) -> (Text -> ByteString) -> Text -> Object
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> ByteString
forall a b. ConvertUtf8 a b => a -> b
encodeUtf8) Text
key
  Object -> Either (Doc AnsiStyle) o
forall o. NvimObject o => Object -> Either (Doc AnsiStyle) o
fromObject Object
value

extractObjectOr :: NvimObject o => Text -> o -> Map Object Object -> o
extractObjectOr :: Text -> o -> Map Object Object -> o
extractObjectOr Text
key o
default' Map Object Object
data' =
  case Text -> Map Object Object -> Either (Doc AnsiStyle) o
forall o.
NvimObject o =>
Text -> Map Object Object -> Either (Doc AnsiStyle) o
extractObject Text
key Map Object Object
data' of
    Right o
a -> o
a
    Left Doc AnsiStyle
_ -> o
default'