{-# LANGUAGE GADTs #-}

module Cardano.Base.Aeson (
  fromJSONKeyText,
) where

import Data.Aeson (FromJSONKey (..), Value (String))
import Data.Aeson.Types (
  FromJSONKeyFunction (..),
  parseEither,
 )
import Data.Coerce (coerce)
import Data.Text (Text)

fromJSONKeyText :: FromJSONKey k => Text -> Either String k
fromJSONKeyText :: forall k. FromJSONKey k => Text -> Either String k
fromJSONKeyText Text
t = case FromJSONKeyFunction k
forall a. FromJSONKey a => FromJSONKeyFunction a
fromJSONKey of
  FromJSONKeyFunction k
FromJSONKeyCoerce -> k -> Either String k
forall a b. b -> Either a b
Right (Text -> k
forall a b. Coercible a b => a -> b
coerce Text
t)
  FromJSONKeyText Text -> k
g -> k -> Either String k
forall a b. b -> Either a b
Right (Text -> k
g Text
t)
  FromJSONKeyTextParser Text -> Parser k
p -> (Text -> Parser k) -> Text -> Either String k
forall a b. (a -> Parser b) -> a -> Either String b
parseEither Text -> Parser k
p Text
t
  FromJSONKeyValue Value -> Parser k
p -> (Value -> Parser k) -> Value -> Either String k
forall a b. (a -> Parser b) -> a -> Either String b
parseEither Value -> Parser k
p (Text -> Value
String Text
t)