{-# LANGUAGE CPP #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE DefaultSignatures #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE NoImplicitPrelude #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE PolyKinds #-}
{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE TupleSections #-}
{-# LANGUAGE UndecidableInstances #-}
{-# LANGUAGE ViewPatterns #-}
#include "incoherent-compat.h"
#include "overlapping-compat.h"
{-# OPTIONS_GHC -fno-warn-deprecations #-}
module Data.Aeson.Types.FromJSON
(
FromJSON(..)
, FromJSON1(..)
, parseJSON1
, FromJSON2(..)
, parseJSON2
, GFromJSON(..)
, FromArgs(..)
, genericParseJSON
, genericLiftParseJSON
, FromJSONKey(..)
, FromJSONKeyFunction(..)
, fromJSONKeyCoerce
, coerceFromJSONKeyFunction
, mapFromJSONKeyFunction
, GFromJSONKey()
, genericFromJSONKey
, listParser
, withObject
, withText
, withArray
, withScientific
, withBool
, withEmbeddedJSON
, fromJSON
, ifromJSON
, typeMismatch
, unexpected
, parseField
, parseFieldMaybe
, parseFieldMaybe'
, explicitParseField
, explicitParseFieldMaybe
, explicitParseFieldMaybe'
, parseIndexedJSON
, (.:)
, (.:?)
, (.:!)
, (.!=)
, parseOptionalFieldWith
) where
import Prelude.Compat
import Control.Applicative ((<|>), Const(..), liftA2)
import Control.Monad (zipWithM)
import Data.Aeson.Internal.Functions (mapKey)
import Data.Aeson.Parser.Internal (eitherDecodeWith, jsonEOF)
import Data.Aeson.Types.Generic
import Data.Aeson.Types.Internal
import Data.Bits (unsafeShiftR)
import Data.Fixed (Fixed, HasResolution (resolution), Nano)
import Data.Functor.Compose (Compose(..))
import Data.Functor.Identity (Identity(..))
import Data.Functor.Product (Product(..))
import Data.Functor.Sum (Sum(..))
import Data.Functor.These (These1 (..))
import Data.Hashable (Hashable(..))
import Data.Int (Int16, Int32, Int64, Int8)
import Data.List.NonEmpty (NonEmpty(..))
import Data.Maybe (fromMaybe)
import Data.Proxy (Proxy(..))
import Data.Ratio ((%), Ratio)
import Data.Scientific (Scientific, base10Exponent)
import Data.Tagged (Tagged(..))
import Data.Text (Text, pack, unpack)
import Data.These (These (..))
import Data.Time (Day, DiffTime, LocalTime, NominalDiffTime, TimeOfDay, UTCTime, ZonedTime)
import Data.Time.Calendar.Compat (CalendarDiffDays (..), DayOfWeek (..))
import Data.Time.Calendar.Month.Compat (Month)
import Data.Time.Calendar.Quarter.Compat (Quarter, QuarterOfYear (..))
import Data.Time.LocalTime.Compat (CalendarDiffTime (..))
import Data.Time.Clock.System.Compat (SystemTime (..))
import Data.Time.Format.Compat (parseTimeM, defaultTimeLocale)
import Data.Traversable as Tr (sequence)
import Data.Vector (Vector)
import Data.Version (Version, parseVersion)
import Data.Void (Void)
import Data.Word (Word16, Word32, Word64, Word8)
import Foreign.Storable (Storable)
import Foreign.C.Types (CTime (..))
import GHC.Generics
import Numeric.Natural (Natural)
import Text.ParserCombinators.ReadP (readP_to_S)
import Unsafe.Coerce (unsafeCoerce)
import qualified Data.Aeson.Parser.Time as Time
import qualified Data.Attoparsec.ByteString.Char8 as A (endOfInput, parseOnly, scientific)
import qualified Data.ByteString.Lazy as L
import qualified Data.DList as DList
#if MIN_VERSION_dlist(1,0,0) && __GLASGOW_HASKELL__ >=800
import qualified Data.DList.DNonEmpty as DNE
#endif
import qualified Data.Fix as F
import qualified Data.HashMap.Strict as H
import qualified Data.HashSet as HashSet
import qualified Data.IntMap as IntMap
import qualified Data.IntSet as IntSet
import qualified Data.Map as M
import qualified Data.Monoid as Monoid
import qualified Data.Scientific as Scientific
import qualified Data.Semigroup as Semigroup
import qualified Data.Sequence as Seq
import qualified Data.Set as Set
import qualified Data.Strict as S
import qualified Data.Text as T
import qualified Data.Text.Encoding as T
import qualified Data.Text.Lazy as LT
import qualified Data.Tree as Tree
import qualified Data.UUID.Types as UUID
import qualified Data.Vector as V
import qualified Data.Vector.Generic as VG
import qualified Data.Vector.Primitive as VP
import qualified Data.Vector.Storable as VS
import qualified Data.Vector.Unboxed as VU
import qualified GHC.Exts as Exts
import qualified Data.Primitive.Array as PM
import qualified Data.Primitive.SmallArray as PM
import qualified Data.Primitive.Types as PM
import qualified Data.Primitive.PrimArray as PM
import Data.Coerce (Coercible, coerce)
parseIndexedJSON :: (Value -> Parser a) -> Int -> Value -> Parser a
parseIndexedJSON :: (Value -> Parser a) -> Int -> Value -> Parser a
parseIndexedJSON Value -> Parser a
p Int
idx Value
value = Value -> Parser a
p Value
value Parser a -> JSONPathElement -> Parser a
forall a. Parser a -> JSONPathElement -> Parser a
<?> Int -> JSONPathElement
Index Int
idx
{-# INLINE parseIndexedJSON #-}
parseIndexedJSONPair :: (Value -> Parser a) -> (Value -> Parser b) -> Int -> Value -> Parser (a, b)
parseIndexedJSONPair :: (Value -> Parser a)
-> (Value -> Parser b) -> Int -> Value -> Parser (a, b)
parseIndexedJSONPair Value -> Parser a
keyParser Value -> Parser b
valParser Int
idx Value
value = Value -> Parser (a, b)
p Value
value Parser (a, b) -> JSONPathElement -> Parser (a, b)
forall a. Parser a -> JSONPathElement -> Parser a
<?> Int -> JSONPathElement
Index Int
idx
where
p :: Value -> Parser (a, b)
p = String -> (Array -> Parser (a, b)) -> Value -> Parser (a, b)
forall a. String -> (Array -> Parser a) -> Value -> Parser a
withArray String
"(k, v)" ((Array -> Parser (a, b)) -> Value -> Parser (a, b))
-> (Array -> Parser (a, b)) -> Value -> Parser (a, b)
forall a b. (a -> b) -> a -> b
$ \Array
ab ->
let n :: Int
n = Array -> Int
forall a. Vector a -> Int
V.length Array
ab
in if Int
n Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
2
then (,) (a -> b -> (a, b)) -> Parser a -> Parser (b -> (a, b))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Value -> Parser a) -> Int -> Array -> Parser a
forall a. (Value -> Parser a) -> Int -> Array -> Parser a
parseJSONElemAtIndex Value -> Parser a
keyParser Int
0 Array
ab
Parser (b -> (a, b)) -> Parser b -> Parser (a, b)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (Value -> Parser b) -> Int -> Array -> Parser b
forall a. (Value -> Parser a) -> Int -> Array -> Parser a
parseJSONElemAtIndex Value -> Parser b
valParser Int
1 Array
ab
else String -> Parser (a, b)
forall (m :: * -> *) a. MonadFail m => String -> m a
fail (String -> Parser (a, b)) -> String -> Parser (a, b)
forall a b. (a -> b) -> a -> b
$ String
"cannot unpack array of length " String -> String -> String
forall a. [a] -> [a] -> [a]
++
Int -> String
forall a. Show a => a -> String
show Int
n String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
" into a pair"
{-# INLINE parseIndexedJSONPair #-}
parseJSONElemAtIndex :: (Value -> Parser a) -> Int -> V.Vector Value -> Parser a
parseJSONElemAtIndex :: (Value -> Parser a) -> Int -> Array -> Parser a
parseJSONElemAtIndex Value -> Parser a
p Int
idx Array
ary = Value -> Parser a
p (Array -> Int -> Value
forall a. Vector a -> Int -> a
V.unsafeIndex Array
ary Int
idx) Parser a -> JSONPathElement -> Parser a
forall a. Parser a -> JSONPathElement -> Parser a
<?> Int -> JSONPathElement
Index Int
idx
parseRealFloat :: RealFloat a => String -> Value -> Parser a
parseRealFloat :: String -> Value -> Parser a
parseRealFloat String
_ (Number Scientific
s) = a -> Parser a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (a -> Parser a) -> a -> Parser a
forall a b. (a -> b) -> a -> b
$ Scientific -> a
forall a. RealFloat a => Scientific -> a
Scientific.toRealFloat Scientific
s
parseRealFloat String
_ Value
Null = a -> Parser a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (a
0a -> a -> a
forall a. Fractional a => a -> a -> a
/a
0)
parseRealFloat String
name Value
v = String -> Parser a -> Parser a
forall a. String -> Parser a -> Parser a
prependContext String
name (Value -> Parser a
forall a. Value -> Parser a
unexpected Value
v)
{-# INLINE parseRealFloat #-}
parseIntegralFromScientific :: forall a. Integral a => Scientific -> Parser a
parseIntegralFromScientific :: Scientific -> Parser a
parseIntegralFromScientific Scientific
s =
case Scientific -> Either Double a
forall r i. (RealFloat r, Integral i) => Scientific -> Either r i
Scientific.floatingOrInteger Scientific
s :: Either Double a of
Right a
x -> a -> Parser a
forall (f :: * -> *) a. Applicative f => a -> f a
pure a
x
Left Double
_ -> String -> Parser a
forall (m :: * -> *) a. MonadFail m => String -> m a
fail (String -> Parser a) -> String -> Parser a
forall a b. (a -> b) -> a -> b
$ String
"unexpected floating number " String -> String -> String
forall a. [a] -> [a] -> [a]
++ Scientific -> String
forall a. Show a => a -> String
show Scientific
s
{-# INLINE parseIntegralFromScientific #-}
parseIntegral :: Integral a => String -> Value -> Parser a
parseIntegral :: String -> Value -> Parser a
parseIntegral String
name =
String -> Parser a -> Parser a
forall a. String -> Parser a -> Parser a
prependContext String
name (Parser a -> Parser a) -> (Value -> Parser a) -> Value -> Parser a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Scientific -> Parser a) -> Value -> Parser a
forall a. (Scientific -> Parser a) -> Value -> Parser a
withBoundedScientific' Scientific -> Parser a
forall a. Integral a => Scientific -> Parser a
parseIntegralFromScientific
{-# INLINE parseIntegral #-}
parseBoundedIntegralFromScientific :: (Bounded a, Integral a) => Scientific -> Parser a
parseBoundedIntegralFromScientific :: Scientific -> Parser a
parseBoundedIntegralFromScientific Scientific
s = Parser a -> (a -> Parser a) -> Maybe a -> Parser a
forall b a. b -> (a -> b) -> Maybe a -> b
maybe
(String -> Parser a
forall (m :: * -> *) a. MonadFail m => String -> m a
fail (String -> Parser a) -> String -> Parser a
forall a b. (a -> b) -> a -> b
$ String
"value is either floating or will cause over or underflow " String -> String -> String
forall a. [a] -> [a] -> [a]
++ Scientific -> String
forall a. Show a => a -> String
show Scientific
s)
a -> Parser a
forall (f :: * -> *) a. Applicative f => a -> f a
pure
(Scientific -> Maybe a
forall i. (Integral i, Bounded i) => Scientific -> Maybe i
Scientific.toBoundedInteger Scientific
s)
{-# INLINE parseBoundedIntegralFromScientific #-}
parseBoundedIntegral :: (Bounded a, Integral a) => String -> Value -> Parser a
parseBoundedIntegral :: String -> Value -> Parser a
parseBoundedIntegral String
name =
String -> Parser a -> Parser a
forall a. String -> Parser a -> Parser a
prependContext String
name (Parser a -> Parser a) -> (Value -> Parser a) -> Value -> Parser a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Scientific -> Parser a) -> Value -> Parser a
forall a. (Scientific -> Parser a) -> Value -> Parser a
withScientific' Scientific -> Parser a
forall a. (Bounded a, Integral a) => Scientific -> Parser a
parseBoundedIntegralFromScientific
{-# INLINE parseBoundedIntegral #-}
parseScientificText :: Text -> Parser Scientific
parseScientificText :: Text -> Parser Scientific
parseScientificText
= (String -> Parser Scientific)
-> (Scientific -> Parser Scientific)
-> Either String Scientific
-> Parser Scientific
forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either String -> Parser Scientific
forall (m :: * -> *) a. MonadFail m => String -> m a
fail Scientific -> Parser Scientific
forall (f :: * -> *) a. Applicative f => a -> f a
pure
(Either String Scientific -> Parser Scientific)
-> (Text -> Either String Scientific) -> Text -> Parser Scientific
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Parser Scientific -> ByteString -> Either String Scientific
forall a. Parser a -> ByteString -> Either String a
A.parseOnly (Parser Scientific
A.scientific Parser Scientific -> Parser ByteString () -> Parser Scientific
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Parser ByteString ()
forall t. Chunk t => Parser t ()
A.endOfInput)
(ByteString -> Either String Scientific)
-> (Text -> ByteString) -> Text -> Either String Scientific
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> ByteString
T.encodeUtf8
parseIntegralText :: Integral a => String -> Text -> Parser a
parseIntegralText :: String -> Text -> Parser a
parseIntegralText String
name Text
t =
String -> Parser a -> Parser a
forall a. String -> Parser a -> Parser a
prependContext String
name (Parser a -> Parser a) -> Parser a -> Parser a
forall a b. (a -> b) -> a -> b
$
Text -> Parser Scientific
parseScientificText Text
t
Parser Scientific
-> (Scientific -> Parser Scientific) -> Parser Scientific
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Scientific -> Parser Scientific
rejectLargeExponent
Parser Scientific -> (Scientific -> Parser a) -> Parser a
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Scientific -> Parser a
forall a. Integral a => Scientific -> Parser a
parseIntegralFromScientific
where
rejectLargeExponent :: Scientific -> Parser Scientific
rejectLargeExponent :: Scientific -> Parser Scientific
rejectLargeExponent Scientific
s = (Scientific -> Parser Scientific) -> Value -> Parser Scientific
forall a. (Scientific -> Parser a) -> Value -> Parser a
withBoundedScientific' Scientific -> Parser Scientific
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Scientific -> Value
Number Scientific
s)
{-# INLINE parseIntegralText #-}
parseBoundedIntegralText :: (Bounded a, Integral a) => String -> Text -> Parser a
parseBoundedIntegralText :: String -> Text -> Parser a
parseBoundedIntegralText String
name Text
t =
String -> Parser a -> Parser a
forall a. String -> Parser a -> Parser a
prependContext String
name (Parser a -> Parser a) -> Parser a -> Parser a
forall a b. (a -> b) -> a -> b
$
Text -> Parser Scientific
parseScientificText Text
t Parser Scientific -> (Scientific -> Parser a) -> Parser a
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Scientific -> Parser a
forall a. (Bounded a, Integral a) => Scientific -> Parser a
parseBoundedIntegralFromScientific
parseOptionalFieldWith :: (Value -> Parser (Maybe a))
-> Object -> Text -> Parser (Maybe a)
parseOptionalFieldWith :: (Value -> Parser (Maybe a)) -> Object -> Text -> Parser (Maybe a)
parseOptionalFieldWith Value -> Parser (Maybe a)
pj Object
obj Text
key =
case Text -> Object -> Maybe Value
forall k v. (Eq k, Hashable k) => k -> HashMap k v -> Maybe v
H.lookup Text
key Object
obj of
Maybe Value
Nothing -> Maybe a -> Parser (Maybe a)
forall (f :: * -> *) a. Applicative f => a -> f a
pure Maybe a
forall a. Maybe a
Nothing
Just Value
v -> Value -> Parser (Maybe a)
pj Value
v Parser (Maybe a) -> JSONPathElement -> Parser (Maybe a)
forall a. Parser a -> JSONPathElement -> Parser a
<?> Text -> JSONPathElement
Key Text
key
{-# INLINE parseOptionalFieldWith #-}
class GFromJSON arity f where
gParseJSON :: Options -> FromArgs arity a -> Value -> Parser (f a)
data FromArgs arity a where
NoFromArgs :: FromArgs Zero a
From1Args :: (Value -> Parser a) -> (Value -> Parser [a]) -> FromArgs One a
genericParseJSON :: (Generic a, GFromJSON Zero (Rep a))
=> Options -> Value -> Parser a
genericParseJSON :: Options -> Value -> Parser a
genericParseJSON Options
opts = (Rep a Any -> a) -> Parser (Rep a Any) -> Parser a
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Rep a Any -> a
forall a x. Generic a => Rep a x -> a
to (Parser (Rep a Any) -> Parser a)
-> (Value -> Parser (Rep a Any)) -> Value -> Parser a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Options -> FromArgs Zero Any -> Value -> Parser (Rep a Any)
forall arity (f :: * -> *) a.
GFromJSON arity f =>
Options -> FromArgs arity a -> Value -> Parser (f a)
gParseJSON Options
opts FromArgs Zero Any
forall a. FromArgs Zero a
NoFromArgs
genericLiftParseJSON :: (Generic1 f, GFromJSON One (Rep1 f))
=> Options -> (Value -> Parser a) -> (Value -> Parser [a])
-> Value -> Parser (f a)
genericLiftParseJSON :: Options
-> (Value -> Parser a)
-> (Value -> Parser [a])
-> Value
-> Parser (f a)
genericLiftParseJSON Options
opts Value -> Parser a
pj Value -> Parser [a]
pjl = (Rep1 f a -> f a) -> Parser (Rep1 f a) -> Parser (f a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Rep1 f a -> f a
forall k (f :: k -> *) (a :: k). Generic1 f => Rep1 f a -> f a
to1 (Parser (Rep1 f a) -> Parser (f a))
-> (Value -> Parser (Rep1 f a)) -> Value -> Parser (f a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Options -> FromArgs One a -> Value -> Parser (Rep1 f a)
forall arity (f :: * -> *) a.
GFromJSON arity f =>
Options -> FromArgs arity a -> Value -> Parser (f a)
gParseJSON Options
opts ((Value -> Parser a) -> (Value -> Parser [a]) -> FromArgs One a
forall a.
(Value -> Parser a) -> (Value -> Parser [a]) -> FromArgs One a
From1Args Value -> Parser a
pj Value -> Parser [a]
pjl)
class FromJSON a where
parseJSON :: Value -> Parser a
default parseJSON :: (Generic a, GFromJSON Zero (Rep a)) => Value -> Parser a
parseJSON = Options -> Value -> Parser a
forall a.
(Generic a, GFromJSON Zero (Rep a)) =>
Options -> Value -> Parser a
genericParseJSON Options
defaultOptions
parseJSONList :: Value -> Parser [a]
parseJSONList = String -> (Array -> Parser [a]) -> Value -> Parser [a]
forall a. String -> (Array -> Parser a) -> Value -> Parser a
withArray String
"[]" ((Array -> Parser [a]) -> Value -> Parser [a])
-> (Array -> Parser [a]) -> Value -> Parser [a]
forall a b. (a -> b) -> a -> b
$ \Array
a ->
(Int -> Value -> Parser a) -> [Int] -> [Value] -> Parser [a]
forall (m :: * -> *) a b c.
Applicative m =>
(a -> b -> m c) -> [a] -> [b] -> m [c]
zipWithM ((Value -> Parser a) -> Int -> Value -> Parser a
forall a. (Value -> Parser a) -> Int -> Value -> Parser a
parseIndexedJSON Value -> Parser a
forall a. FromJSON a => Value -> Parser a
parseJSON) [Int
0..]
([Value] -> Parser [a])
-> (Array -> [Value]) -> Array -> Parser [a]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Array -> [Value]
forall a. Vector a -> [a]
V.toList
(Array -> Parser [a]) -> Array -> Parser [a]
forall a b. (a -> b) -> a -> b
$ Array
a
class FromJSONKey a where
fromJSONKey :: FromJSONKeyFunction a
default fromJSONKey :: FromJSON a => FromJSONKeyFunction a
fromJSONKey = (Value -> Parser a) -> FromJSONKeyFunction a
forall a. (Value -> Parser a) -> FromJSONKeyFunction a
FromJSONKeyValue Value -> Parser a
forall a. FromJSON a => Value -> Parser a
parseJSON
fromJSONKeyList :: FromJSONKeyFunction [a]
default fromJSONKeyList :: FromJSON a => FromJSONKeyFunction [a]
fromJSONKeyList = (Value -> Parser [a]) -> FromJSONKeyFunction [a]
forall a. (Value -> Parser a) -> FromJSONKeyFunction a
FromJSONKeyValue Value -> Parser [a]
forall a. FromJSON a => Value -> Parser a
parseJSON
data FromJSONKeyFunction a where
FromJSONKeyCoerce :: Coercible Text a => FromJSONKeyFunction a
FromJSONKeyText :: !(Text -> a) -> FromJSONKeyFunction a
FromJSONKeyTextParser :: !(Text -> Parser a) -> FromJSONKeyFunction a
FromJSONKeyValue :: !(Value -> Parser a) -> FromJSONKeyFunction a
instance Functor FromJSONKeyFunction where
fmap :: (a -> b) -> FromJSONKeyFunction a -> FromJSONKeyFunction b
fmap a -> b
h FromJSONKeyFunction a
FromJSONKeyCoerce = (Text -> b) -> FromJSONKeyFunction b
forall a. (Text -> a) -> FromJSONKeyFunction a
FromJSONKeyText (a -> b
h (a -> b) -> (Text -> a) -> Text -> b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> a
coerce)
fmap a -> b
h (FromJSONKeyText Text -> a
f) = (Text -> b) -> FromJSONKeyFunction b
forall a. (Text -> a) -> FromJSONKeyFunction a
FromJSONKeyText (a -> b
h (a -> b) -> (Text -> a) -> Text -> b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> a
f)
fmap a -> b
h (FromJSONKeyTextParser Text -> Parser a
f) = (Text -> Parser b) -> FromJSONKeyFunction b
forall a. (Text -> Parser a) -> FromJSONKeyFunction a
FromJSONKeyTextParser ((a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap a -> b
h (Parser a -> Parser b) -> (Text -> Parser a) -> Text -> Parser b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> Parser a
f)
fmap a -> b
h (FromJSONKeyValue Value -> Parser a
f) = (Value -> Parser b) -> FromJSONKeyFunction b
forall a. (Value -> Parser a) -> FromJSONKeyFunction a
FromJSONKeyValue ((a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap a -> b
h (Parser a -> Parser b) -> (Value -> Parser a) -> Value -> Parser b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Value -> Parser a
f)
fromJSONKeyCoerce ::
Coercible Text a =>
FromJSONKeyFunction a
fromJSONKeyCoerce :: FromJSONKeyFunction a
fromJSONKeyCoerce = FromJSONKeyFunction a
forall a. Coercible Text a => FromJSONKeyFunction a
FromJSONKeyCoerce
coerceFromJSONKeyFunction ::
Coercible a b =>
FromJSONKeyFunction a -> FromJSONKeyFunction b
coerceFromJSONKeyFunction :: FromJSONKeyFunction a -> FromJSONKeyFunction b
coerceFromJSONKeyFunction = FromJSONKeyFunction a -> FromJSONKeyFunction b
coerce
{-# RULES
"FromJSONKeyCoerce: fmap coerce" forall x .
fmap coerce x = coerceFromJSONKeyFunction x
#-}
mapFromJSONKeyFunction :: (a -> b) -> FromJSONKeyFunction a -> FromJSONKeyFunction b
mapFromJSONKeyFunction :: (a -> b) -> FromJSONKeyFunction a -> FromJSONKeyFunction b
mapFromJSONKeyFunction = (a -> b) -> FromJSONKeyFunction a -> FromJSONKeyFunction b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap
genericFromJSONKey :: forall a. (Generic a, GFromJSONKey (Rep a))
=> JSONKeyOptions
-> FromJSONKeyFunction a
genericFromJSONKey :: JSONKeyOptions -> FromJSONKeyFunction a
genericFromJSONKey JSONKeyOptions
opts = (Text -> Parser a) -> FromJSONKeyFunction a
forall a. (Text -> Parser a) -> FromJSONKeyFunction a
FromJSONKeyTextParser ((Text -> Parser a) -> FromJSONKeyFunction a)
-> (Text -> Parser a) -> FromJSONKeyFunction a
forall a b. (a -> b) -> a -> b
$ \Text
t ->
case (String -> String) -> Text -> Maybe (Rep a Any)
forall k (f :: k -> *) (a :: k).
SumFromString f =>
(String -> String) -> Text -> Maybe (f a)
parseSumFromString (JSONKeyOptions -> String -> String
keyModifier JSONKeyOptions
opts) Text
t of
Maybe (Rep a Any)
Nothing -> String -> Parser a
forall (m :: * -> *) a. MonadFail m => String -> m a
fail (String -> Parser a) -> String -> Parser a
forall a b. (a -> b) -> a -> b
$
String
"invalid key " String -> String -> String
forall a. [a] -> [a] -> [a]
++ Text -> String
forall a. Show a => a -> String
show Text
t String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
", expected one of " String -> String -> String
forall a. [a] -> [a] -> [a]
++ [String] -> String
forall a. Show a => a -> String
show [String]
cnames
Just Rep a Any
k -> a -> Parser a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Rep a Any -> a
forall a x. Generic a => Rep a x -> a
to Rep a Any
k)
where
cnames :: [String]
cnames = Tagged2 (Rep a) [String] -> [String]
forall (s :: * -> *) b. Tagged2 s b -> b
unTagged2 ((String -> String) -> Tagged2 (Rep a) [String]
forall (a :: * -> *) t.
ConstructorNames a =>
(String -> t) -> Tagged2 a [t]
constructorTags (JSONKeyOptions -> String -> String
keyModifier JSONKeyOptions
opts) :: Tagged2 (Rep a) [String])
class (ConstructorNames f, SumFromString f) => GFromJSONKey f where
instance (ConstructorNames f, SumFromString f) => GFromJSONKey f where
typeMismatch :: String
-> Value
-> Parser a
typeMismatch :: String -> Value -> Parser a
typeMismatch String
expected Value
actual =
String -> Parser a
forall (m :: * -> *) a. MonadFail m => String -> m a
fail (String -> Parser a) -> String -> Parser a
forall a b. (a -> b) -> a -> b
$ String
"expected " String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
expected String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
", but encountered " String -> String -> String
forall a. [a] -> [a] -> [a]
++ Value -> String
typeOf Value
actual
unexpected :: Value -> Parser a
unexpected :: Value -> Parser a
unexpected Value
actual = String -> Parser a
forall (m :: * -> *) a. MonadFail m => String -> m a
fail (String -> Parser a) -> String -> Parser a
forall a b. (a -> b) -> a -> b
$ String
"unexpected " String -> String -> String
forall a. [a] -> [a] -> [a]
++ Value -> String
typeOf Value
actual
typeOf :: Value -> String
typeOf :: Value -> String
typeOf Value
v = case Value
v of
Object Object
_ -> String
"Object"
Array Array
_ -> String
"Array"
String Text
_ -> String
"String"
Number Scientific
_ -> String
"Number"
Bool Bool
_ -> String
"Boolean"
Value
Null -> String
"Null"
class FromJSON1 f where
liftParseJSON :: (Value -> Parser a) -> (Value -> Parser [a]) -> Value -> Parser (f a)
default liftParseJSON :: (Generic1 f, GFromJSON One (Rep1 f))
=> (Value -> Parser a) -> (Value -> Parser [a]) -> Value -> Parser (f a)
liftParseJSON = Options
-> (Value -> Parser a)
-> (Value -> Parser [a])
-> Value
-> Parser (f a)
forall (f :: * -> *) a.
(Generic1 f, GFromJSON One (Rep1 f)) =>
Options
-> (Value -> Parser a)
-> (Value -> Parser [a])
-> Value
-> Parser (f a)
genericLiftParseJSON Options
defaultOptions
liftParseJSONList :: (Value -> Parser a) -> (Value -> Parser [a]) -> Value -> Parser [f a]
liftParseJSONList Value -> Parser a
f Value -> Parser [a]
g Value
v = (Value -> Parser (f a)) -> Value -> Parser [f a]
forall a. (Value -> Parser a) -> Value -> Parser [a]
listParser ((Value -> Parser a)
-> (Value -> Parser [a]) -> Value -> Parser (f a)
forall (f :: * -> *) a.
FromJSON1 f =>
(Value -> Parser a)
-> (Value -> Parser [a]) -> Value -> Parser (f a)
liftParseJSON Value -> Parser a
f Value -> Parser [a]
g) Value
v
parseJSON1 :: (FromJSON1 f, FromJSON a) => Value -> Parser (f a)
parseJSON1 :: Value -> Parser (f a)
parseJSON1 = (Value -> Parser a)
-> (Value -> Parser [a]) -> Value -> Parser (f a)
forall (f :: * -> *) a.
FromJSON1 f =>
(Value -> Parser a)
-> (Value -> Parser [a]) -> Value -> Parser (f a)
liftParseJSON Value -> Parser a
forall a. FromJSON a => Value -> Parser a
parseJSON Value -> Parser [a]
forall a. FromJSON a => Value -> Parser [a]
parseJSONList
{-# INLINE parseJSON1 #-}
class FromJSON2 f where
liftParseJSON2
:: (Value -> Parser a)
-> (Value -> Parser [a])
-> (Value -> Parser b)
-> (Value -> Parser [b])
-> Value -> Parser (f a b)
liftParseJSONList2
:: (Value -> Parser a)
-> (Value -> Parser [a])
-> (Value -> Parser b)
-> (Value -> Parser [b])
-> Value -> Parser [f a b]
liftParseJSONList2 Value -> Parser a
fa Value -> Parser [a]
ga Value -> Parser b
fb Value -> Parser [b]
gb = String -> (Array -> Parser [f a b]) -> Value -> Parser [f a b]
forall a. String -> (Array -> Parser a) -> Value -> Parser a
withArray String
"[]" ((Array -> Parser [f a b]) -> Value -> Parser [f a b])
-> (Array -> Parser [f a b]) -> Value -> Parser [f a b]
forall a b. (a -> b) -> a -> b
$ \Array
vals ->
(Vector (f a b) -> [f a b])
-> Parser (Vector (f a b)) -> Parser [f a b]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Vector (f a b) -> [f a b]
forall a. Vector a -> [a]
V.toList ((Value -> Parser (f a b)) -> Array -> Parser (Vector (f a b))
forall (m :: * -> *) a b.
Monad m =>
(a -> m b) -> Vector a -> m (Vector b)
V.mapM ((Value -> Parser a)
-> (Value -> Parser [a])
-> (Value -> Parser b)
-> (Value -> Parser [b])
-> Value
-> Parser (f a b)
forall (f :: * -> * -> *) a b.
FromJSON2 f =>
(Value -> Parser a)
-> (Value -> Parser [a])
-> (Value -> Parser b)
-> (Value -> Parser [b])
-> Value
-> Parser (f a b)
liftParseJSON2 Value -> Parser a
fa Value -> Parser [a]
ga Value -> Parser b
fb Value -> Parser [b]
gb) Array
vals)
parseJSON2 :: (FromJSON2 f, FromJSON a, FromJSON b) => Value -> Parser (f a b)
parseJSON2 :: Value -> Parser (f a b)
parseJSON2 = (Value -> Parser a)
-> (Value -> Parser [a])
-> (Value -> Parser b)
-> (Value -> Parser [b])
-> Value
-> Parser (f a b)
forall (f :: * -> * -> *) a b.
FromJSON2 f =>
(Value -> Parser a)
-> (Value -> Parser [a])
-> (Value -> Parser b)
-> (Value -> Parser [b])
-> Value
-> Parser (f a b)
liftParseJSON2 Value -> Parser a
forall a. FromJSON a => Value -> Parser a
parseJSON Value -> Parser [a]
forall a. FromJSON a => Value -> Parser [a]
parseJSONList Value -> Parser b
forall a. FromJSON a => Value -> Parser a
parseJSON Value -> Parser [b]
forall a. FromJSON a => Value -> Parser [a]
parseJSONList
{-# INLINE parseJSON2 #-}
listParser :: (Value -> Parser a) -> Value -> Parser [a]
listParser :: (Value -> Parser a) -> Value -> Parser [a]
listParser Value -> Parser a
f (Array Array
xs) = (Vector a -> [a]) -> Parser (Vector a) -> Parser [a]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Vector a -> [a]
forall a. Vector a -> [a]
V.toList ((Value -> Parser a) -> Array -> Parser (Vector a)
forall (m :: * -> *) a b.
Monad m =>
(a -> m b) -> Vector a -> m (Vector b)
V.mapM Value -> Parser a
f Array
xs)
listParser Value -> Parser a
_ Value
v = String -> Value -> Parser [a]
forall a. String -> Value -> Parser a
typeMismatch String
"Array" Value
v
{-# INLINE listParser #-}
instance FromJSON1 [] where
liftParseJSON :: (Value -> Parser a) -> (Value -> Parser [a]) -> Value -> Parser [a]
liftParseJSON Value -> Parser a
_ Value -> Parser [a]
p' = Value -> Parser [a]
p'
{-# INLINE liftParseJSON #-}
instance (FromJSON a) => FromJSON [a] where
parseJSON :: Value -> Parser [a]
parseJSON = Value -> Parser [a]
forall (f :: * -> *) a.
(FromJSON1 f, FromJSON a) =>
Value -> Parser (f a)
parseJSON1
prependContext :: String -> Parser a -> Parser a
prependContext :: String -> Parser a -> Parser a
prependContext String
name = String -> Parser a -> Parser a
forall a. String -> Parser a -> Parser a
prependFailure (String
"parsing " String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
name String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
" failed, ")
withObject :: String -> (Object -> Parser a) -> Value -> Parser a
withObject :: String -> (Object -> Parser a) -> Value -> Parser a
withObject String
_ Object -> Parser a
f (Object Object
obj) = Object -> Parser a
f Object
obj
withObject String
name Object -> Parser a
_ Value
v = String -> Parser a -> Parser a
forall a. String -> Parser a -> Parser a
prependContext String
name (String -> Value -> Parser a
forall a. String -> Value -> Parser a
typeMismatch String
"Object" Value
v)
{-# INLINE withObject #-}
withText :: String -> (Text -> Parser a) -> Value -> Parser a
withText :: String -> (Text -> Parser a) -> Value -> Parser a
withText String
_ Text -> Parser a
f (String Text
txt) = Text -> Parser a
f Text
txt
withText String
name Text -> Parser a
_ Value
v = String -> Parser a -> Parser a
forall a. String -> Parser a -> Parser a
prependContext String
name (String -> Value -> Parser a
forall a. String -> Value -> Parser a
typeMismatch String
"String" Value
v)
{-# INLINE withText #-}
withArray :: String -> (Array -> Parser a) -> Value -> Parser a
withArray :: String -> (Array -> Parser a) -> Value -> Parser a
withArray String
_ Array -> Parser a
f (Array Array
arr) = Array -> Parser a
f Array
arr
withArray String
name Array -> Parser a
_ Value
v = String -> Parser a -> Parser a
forall a. String -> Parser a -> Parser a
prependContext String
name (String -> Value -> Parser a
forall a. String -> Value -> Parser a
typeMismatch String
"Array" Value
v)
{-# INLINE withArray #-}
withScientific :: String -> (Scientific -> Parser a) -> Value -> Parser a
withScientific :: String -> (Scientific -> Parser a) -> Value -> Parser a
withScientific String
_ Scientific -> Parser a
f (Number Scientific
scientific) = Scientific -> Parser a
f Scientific
scientific
withScientific String
name Scientific -> Parser a
_ Value
v = String -> Parser a -> Parser a
forall a. String -> Parser a -> Parser a
prependContext String
name (String -> Value -> Parser a
forall a. String -> Value -> Parser a
typeMismatch String
"Number" Value
v)
{-# INLINE withScientific #-}
withScientific' :: (Scientific -> Parser a) -> Value -> Parser a
withScientific' :: (Scientific -> Parser a) -> Value -> Parser a
withScientific' Scientific -> Parser a
f Value
v = case Value
v of
Number Scientific
n -> Scientific -> Parser a
f Scientific
n
Value
_ -> String -> Value -> Parser a
forall a. String -> Value -> Parser a
typeMismatch String
"Number" Value
v
{-# INLINE withScientific' #-}
withBoundedScientific :: String -> (Scientific -> Parser a) -> Value -> Parser a
withBoundedScientific :: String -> (Scientific -> Parser a) -> Value -> Parser a
withBoundedScientific String
name Scientific -> Parser a
f Value
v = (Parser a -> Parser a)
-> (Scientific -> Parser a) -> Value -> Parser a
forall a.
(Parser a -> Parser a)
-> (Scientific -> Parser a) -> Value -> Parser a
withBoundedScientific_ (String -> Parser a -> Parser a
forall a. String -> Parser a -> Parser a
prependContext String
name) Scientific -> Parser a
f Value
v
{-# INLINE withBoundedScientific #-}
withBoundedScientific' :: (Scientific -> Parser a) -> Value -> Parser a
withBoundedScientific' :: (Scientific -> Parser a) -> Value -> Parser a
withBoundedScientific' Scientific -> Parser a
f Value
v = (Parser a -> Parser a)
-> (Scientific -> Parser a) -> Value -> Parser a
forall a.
(Parser a -> Parser a)
-> (Scientific -> Parser a) -> Value -> Parser a
withBoundedScientific_ Parser a -> Parser a
forall a. a -> a
id Scientific -> Parser a
f Value
v
{-# INLINE withBoundedScientific' #-}
withBoundedScientific_ :: (Parser a -> Parser a) -> (Scientific -> Parser a) -> Value -> Parser a
withBoundedScientific_ :: (Parser a -> Parser a)
-> (Scientific -> Parser a) -> Value -> Parser a
withBoundedScientific_ Parser a -> Parser a
whenFail Scientific -> Parser a
f (Number Scientific
scientific) =
if Int
exp10 Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> Int
1024
then Parser a -> Parser a
whenFail (String -> Parser a
forall (m :: * -> *) a. MonadFail m => String -> m a
fail String
msg)
else Scientific -> Parser a
f Scientific
scientific
where
exp10 :: Int
exp10 = Scientific -> Int
base10Exponent Scientific
scientific
msg :: String
msg = String
"found a number with exponent " String -> String -> String
forall a. [a] -> [a] -> [a]
++ Int -> String
forall a. Show a => a -> String
show Int
exp10 String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
", but it must not be greater than 1024"
withBoundedScientific_ Parser a -> Parser a
whenFail Scientific -> Parser a
_ Value
v =
Parser a -> Parser a
whenFail (String -> Value -> Parser a
forall a. String -> Value -> Parser a
typeMismatch String
"Number" Value
v)
{-# INLINE withBoundedScientific_ #-}
withBool :: String -> (Bool -> Parser a) -> Value -> Parser a
withBool :: String -> (Bool -> Parser a) -> Value -> Parser a
withBool String
_ Bool -> Parser a
f (Bool Bool
arr) = Bool -> Parser a
f Bool
arr
withBool String
name Bool -> Parser a
_ Value
v = String -> Parser a -> Parser a
forall a. String -> Parser a -> Parser a
prependContext String
name (String -> Value -> Parser a
forall a. String -> Value -> Parser a
typeMismatch String
"Boolean" Value
v)
{-# INLINE withBool #-}
withEmbeddedJSON :: String -> (Value -> Parser a) -> Value -> Parser a
withEmbeddedJSON :: String -> (Value -> Parser a) -> Value -> Parser a
withEmbeddedJSON String
_ Value -> Parser a
innerParser (String Text
txt) =
(String -> Parser a)
-> (Value -> Parser a) -> Either String Value -> Parser a
forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either String -> Parser a
forall (m :: * -> *) a. MonadFail m => String -> m a
fail Value -> Parser a
innerParser (Either String Value -> Parser a)
-> Either String Value -> Parser a
forall a b. (a -> b) -> a -> b
$ ByteString -> Either String Value
eitherDecode (ByteString -> ByteString
L.fromStrict (ByteString -> ByteString) -> ByteString -> ByteString
forall a b. (a -> b) -> a -> b
$ Text -> ByteString
T.encodeUtf8 Text
txt)
where
eitherDecode :: ByteString -> Either String Value
eitherDecode = Either (JSONPath, String) Value -> Either String Value
forall b. Either (JSONPath, String) b -> Either String b
eitherFormatError (Either (JSONPath, String) Value -> Either String Value)
-> (ByteString -> Either (JSONPath, String) Value)
-> ByteString
-> Either String Value
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Parser Value
-> (Value -> IResult Value)
-> ByteString
-> Either (JSONPath, String) Value
forall a.
Parser Value
-> (Value -> IResult a)
-> ByteString
-> Either (JSONPath, String) a
eitherDecodeWith Parser Value
jsonEOF Value -> IResult Value
forall a. FromJSON a => Value -> IResult a
ifromJSON
eitherFormatError :: Either (JSONPath, String) b -> Either String b
eitherFormatError = ((JSONPath, String) -> Either String b)
-> (b -> Either String b)
-> Either (JSONPath, String) b
-> Either String b
forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either (String -> Either String b
forall a b. a -> Either a b
Left (String -> Either String b)
-> ((JSONPath, String) -> String)
-> (JSONPath, String)
-> Either String b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (JSONPath -> String -> String) -> (JSONPath, String) -> String
forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry JSONPath -> String -> String
formatError) b -> Either String b
forall a b. b -> Either a b
Right
withEmbeddedJSON String
name Value -> Parser a
_ Value
v = String -> Parser a -> Parser a
forall a. String -> Parser a -> Parser a
prependContext String
name (String -> Value -> Parser a
forall a. String -> Value -> Parser a
typeMismatch String
"String" Value
v)
{-# INLINE withEmbeddedJSON #-}
fromJSON :: (FromJSON a) => Value -> Result a
fromJSON :: Value -> Result a
fromJSON = (Value -> Parser a) -> Value -> Result a
forall a b. (a -> Parser b) -> a -> Result b
parse Value -> Parser a
forall a. FromJSON a => Value -> Parser a
parseJSON
{-# INLINE fromJSON #-}
ifromJSON :: (FromJSON a) => Value -> IResult a
ifromJSON :: Value -> IResult a
ifromJSON = (Value -> Parser a) -> Value -> IResult a
forall a b. (a -> Parser b) -> a -> IResult b
iparse Value -> Parser a
forall a. FromJSON a => Value -> Parser a
parseJSON
{-# INLINE ifromJSON #-}
(.:) :: (FromJSON a) => Object -> Text -> Parser a
.: :: Object -> Text -> Parser a
(.:) = (Value -> Parser a) -> Object -> Text -> Parser a
forall a. (Value -> Parser a) -> Object -> Text -> Parser a
explicitParseField Value -> Parser a
forall a. FromJSON a => Value -> Parser a
parseJSON
{-# INLINE (.:) #-}
(.:?) :: (FromJSON a) => Object -> Text -> Parser (Maybe a)
.:? :: Object -> Text -> Parser (Maybe a)
(.:?) = (Value -> Parser a) -> Object -> Text -> Parser (Maybe a)
forall a. (Value -> Parser a) -> Object -> Text -> Parser (Maybe a)
explicitParseFieldMaybe Value -> Parser a
forall a. FromJSON a => Value -> Parser a
parseJSON
{-# INLINE (.:?) #-}
(.:!) :: (FromJSON a) => Object -> Text -> Parser (Maybe a)
.:! :: Object -> Text -> Parser (Maybe a)
(.:!) = (Value -> Parser a) -> Object -> Text -> Parser (Maybe a)
forall a. (Value -> Parser a) -> Object -> Text -> Parser (Maybe a)
explicitParseFieldMaybe' Value -> Parser a
forall a. FromJSON a => Value -> Parser a
parseJSON
{-# INLINE (.:!) #-}
parseField :: (FromJSON a) => Object -> Text -> Parser a
parseField :: Object -> Text -> Parser a
parseField = Object -> Text -> Parser a
forall a. FromJSON a => Object -> Text -> Parser a
(.:)
{-# INLINE parseField #-}
parseFieldMaybe :: (FromJSON a) => Object -> Text -> Parser (Maybe a)
parseFieldMaybe :: Object -> Text -> Parser (Maybe a)
parseFieldMaybe = Object -> Text -> Parser (Maybe a)
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
(.:?)
{-# INLINE parseFieldMaybe #-}
parseFieldMaybe' :: (FromJSON a) => Object -> Text -> Parser (Maybe a)
parseFieldMaybe' :: Object -> Text -> Parser (Maybe a)
parseFieldMaybe' = Object -> Text -> Parser (Maybe a)
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
(.:!)
{-# INLINE parseFieldMaybe' #-}
explicitParseField :: (Value -> Parser a) -> Object -> Text -> Parser a
explicitParseField :: (Value -> Parser a) -> Object -> Text -> Parser a
explicitParseField Value -> Parser a
p Object
obj Text
key = case Text -> Object -> Maybe Value
forall k v. (Eq k, Hashable k) => k -> HashMap k v -> Maybe v
H.lookup Text
key Object
obj of
Maybe Value
Nothing -> String -> Parser a
forall (m :: * -> *) a. MonadFail m => String -> m a
fail (String -> Parser a) -> String -> Parser a
forall a b. (a -> b) -> a -> b
$ String
"key " String -> String -> String
forall a. [a] -> [a] -> [a]
++ Text -> String
forall a. Show a => a -> String
show Text
key String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
" not found"
Just Value
v -> Value -> Parser a
p Value
v Parser a -> JSONPathElement -> Parser a
forall a. Parser a -> JSONPathElement -> Parser a
<?> Text -> JSONPathElement
Key Text
key
{-# INLINE explicitParseField #-}
explicitParseFieldMaybe :: (Value -> Parser a) -> Object -> Text -> Parser (Maybe a)
explicitParseFieldMaybe :: (Value -> Parser a) -> Object -> Text -> Parser (Maybe a)
explicitParseFieldMaybe Value -> Parser a
p Object
obj Text
key = case Text -> Object -> Maybe Value
forall k v. (Eq k, Hashable k) => k -> HashMap k v -> Maybe v
H.lookup Text
key Object
obj of
Maybe Value
Nothing -> Maybe a -> Parser (Maybe a)
forall (f :: * -> *) a. Applicative f => a -> f a
pure Maybe a
forall a. Maybe a
Nothing
Just Value
v -> (Value -> Parser a)
-> (Value -> Parser [a]) -> Value -> Parser (Maybe a)
forall (f :: * -> *) a.
FromJSON1 f =>
(Value -> Parser a)
-> (Value -> Parser [a]) -> Value -> Parser (f a)
liftParseJSON Value -> Parser a
p ((Value -> Parser a) -> Value -> Parser [a]
forall a. (Value -> Parser a) -> Value -> Parser [a]
listParser Value -> Parser a
p) Value
v Parser (Maybe a) -> JSONPathElement -> Parser (Maybe a)
forall a. Parser a -> JSONPathElement -> Parser a
<?> Text -> JSONPathElement
Key Text
key
{-# INLINE explicitParseFieldMaybe #-}
explicitParseFieldMaybe' :: (Value -> Parser a) -> Object -> Text -> Parser (Maybe a)
explicitParseFieldMaybe' :: (Value -> Parser a) -> Object -> Text -> Parser (Maybe a)
explicitParseFieldMaybe' Value -> Parser a
p Object
obj Text
key = case Text -> Object -> Maybe Value
forall k v. (Eq k, Hashable k) => k -> HashMap k v -> Maybe v
H.lookup Text
key Object
obj of
Maybe Value
Nothing -> Maybe a -> Parser (Maybe a)
forall (f :: * -> *) a. Applicative f => a -> f a
pure Maybe a
forall a. Maybe a
Nothing
Just Value
v -> a -> Maybe a
forall a. a -> Maybe a
Just (a -> Maybe a) -> Parser a -> Parser (Maybe a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Value -> Parser a
p Value
v Parser a -> JSONPathElement -> Parser a
forall a. Parser a -> JSONPathElement -> Parser a
<?> Text -> JSONPathElement
Key Text
key
{-# INLINE explicitParseFieldMaybe' #-}
(.!=) :: Parser (Maybe a) -> a -> Parser a
Parser (Maybe a)
pmval .!= :: Parser (Maybe a) -> a -> Parser a
.!= a
val = a -> Maybe a -> a
forall a. a -> Maybe a -> a
fromMaybe a
val (Maybe a -> a) -> Parser (Maybe a) -> Parser a
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser (Maybe a)
pmval
{-# INLINE (.!=) #-}
instance GFromJSON arity V1 where
gParseJSON :: Options -> FromArgs arity a -> Value -> Parser (V1 a)
gParseJSON Options
_ FromArgs arity a
_ Value
_ = String -> Parser (V1 a)
forall (m :: * -> *) a. MonadFail m => String -> m a
fail String
"Attempted to parse empty type"
instance OVERLAPPABLE_ (GFromJSON arity a) => GFromJSON arity (M1 i c a) where
gParseJSON :: Options -> FromArgs arity a -> Value -> Parser (M1 i c a a)
gParseJSON Options
opts FromArgs arity a
fargs = (a a -> M1 i c a a) -> Parser (a a) -> Parser (M1 i c a a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap a a -> M1 i c a a
forall k i (c :: Meta) (f :: k -> *) (p :: k). f p -> M1 i c f p
M1 (Parser (a a) -> Parser (M1 i c a a))
-> (Value -> Parser (a a)) -> Value -> Parser (M1 i c a a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Options -> FromArgs arity a -> Value -> Parser (a a)
forall arity (f :: * -> *) a.
GFromJSON arity f =>
Options -> FromArgs arity a -> Value -> Parser (f a)
gParseJSON Options
opts FromArgs arity a
fargs
type TypeName = String
type ConName = String
contextType :: TypeName -> Parser a -> Parser a
contextType :: String -> Parser a -> Parser a
contextType = String -> Parser a -> Parser a
forall a. String -> Parser a -> Parser a
prependContext
contextTag :: Text -> [String] -> Parser a -> Parser a
contextTag :: Text -> [String] -> Parser a -> Parser a
contextTag Text
tagKey [String]
cnames = String -> Parser a -> Parser a
forall a. String -> Parser a -> Parser a
prependFailure
(String
"expected Object with key \"" String -> String -> String
forall a. [a] -> [a] -> [a]
++ Text -> String
unpack Text
tagKey String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
"\"" String -> String -> String
forall a. [a] -> [a] -> [a]
++
String
" containing one of " String -> String -> String
forall a. [a] -> [a] -> [a]
++ [String] -> String
forall a. Show a => a -> String
show [String]
cnames String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
", ")
contextCons :: ConName -> TypeName -> Parser a -> Parser a
contextCons :: String -> String -> Parser a -> Parser a
contextCons String
cname String
tname = String -> Parser a -> Parser a
forall a. String -> Parser a -> Parser a
prependContext (String -> String -> String
showCons String
cname String
tname)
showCons :: ConName -> TypeName -> String
showCons :: String -> String -> String
showCons String
cname String
tname = String
tname String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
"(" String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
cname String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
")"
instance (FromJSON a) => GFromJSON arity (K1 i a) where
gParseJSON :: Options -> FromArgs arity a -> Value -> Parser (K1 i a a)
gParseJSON Options
_opts FromArgs arity a
_ = (a -> K1 i a a) -> Parser a -> Parser (K1 i a a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap a -> K1 i a a
forall k i c (p :: k). c -> K1 i c p
K1 (Parser a -> Parser (K1 i a a))
-> (Value -> Parser a) -> Value -> Parser (K1 i a a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Value -> Parser a
forall a. FromJSON a => Value -> Parser a
parseJSON
instance GFromJSON One Par1 where
gParseJSON :: Options -> FromArgs One a -> Value -> Parser (Par1 a)
gParseJSON Options
_opts (From1Args Value -> Parser a
pj Value -> Parser [a]
_) = (a -> Par1 a) -> Parser a -> Parser (Par1 a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap a -> Par1 a
forall p. p -> Par1 p
Par1 (Parser a -> Parser (Par1 a))
-> (Value -> Parser a) -> Value -> Parser (Par1 a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Value -> Parser a
pj
instance (FromJSON1 f) => GFromJSON One (Rec1 f) where
gParseJSON :: Options -> FromArgs One a -> Value -> Parser (Rec1 f a)
gParseJSON Options
_opts (From1Args Value -> Parser a
pj Value -> Parser [a]
pjl) = (f a -> Rec1 f a) -> Parser (f a) -> Parser (Rec1 f a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap f a -> Rec1 f a
forall k (f :: k -> *) (p :: k). f p -> Rec1 f p
Rec1 (Parser (f a) -> Parser (Rec1 f a))
-> (Value -> Parser (f a)) -> Value -> Parser (Rec1 f a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Value -> Parser a)
-> (Value -> Parser [a]) -> Value -> Parser (f a)
forall (f :: * -> *) a.
FromJSON1 f =>
(Value -> Parser a)
-> (Value -> Parser [a]) -> Value -> Parser (f a)
liftParseJSON Value -> Parser a
pj Value -> Parser [a]
pjl
instance (FromJSON1 f, GFromJSON One g) => GFromJSON One (f :.: g) where
gParseJSON :: Options -> FromArgs One a -> Value -> Parser ((:.:) f g a)
gParseJSON Options
opts FromArgs One a
fargs =
let gpj :: Value -> Parser (g a)
gpj = Options -> FromArgs One a -> Value -> Parser (g a)
forall arity (f :: * -> *) a.
GFromJSON arity f =>
Options -> FromArgs arity a -> Value -> Parser (f a)
gParseJSON Options
opts FromArgs One a
fargs in
(f (g a) -> (:.:) f g a)
-> Parser (f (g a)) -> Parser ((:.:) f g a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap f (g a) -> (:.:) f g a
forall k2 k1 (f :: k2 -> *) (g :: k1 -> k2) (p :: k1).
f (g p) -> (:.:) f g p
Comp1 (Parser (f (g a)) -> Parser ((:.:) f g a))
-> (Value -> Parser (f (g a))) -> Value -> Parser ((:.:) f g a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Value -> Parser (g a))
-> (Value -> Parser [g a]) -> Value -> Parser (f (g a))
forall (f :: * -> *) a.
FromJSON1 f =>
(Value -> Parser a)
-> (Value -> Parser [a]) -> Value -> Parser (f a)
liftParseJSON Value -> Parser (g a)
gpj ((Value -> Parser (g a)) -> Value -> Parser [g a]
forall a. (Value -> Parser a) -> Value -> Parser [a]
listParser Value -> Parser (g a)
gpj)
instance (GFromJSON' arity a, Datatype d) => GFromJSON arity (D1 d a) where
gParseJSON :: Options -> FromArgs arity a -> Value -> Parser (D1 d a a)
gParseJSON Options
opts FromArgs arity a
fargs = (a a -> D1 d a a) -> Parser (a a) -> Parser (D1 d a a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap a a -> D1 d a a
forall k i (c :: Meta) (f :: k -> *) (p :: k). f p -> M1 i c f p
M1 (Parser (a a) -> Parser (D1 d a a))
-> (Value -> Parser (a a)) -> Value -> Parser (D1 d a a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (String :* (Options :* FromArgs arity a)) -> Value -> Parser (a a)
forall arity (f :: * -> *) a.
GFromJSON' arity f =>
(String :* (Options :* FromArgs arity a)) -> Value -> Parser (f a)
gParseJSON' (String
tname String
-> (Options :* FromArgs arity a)
-> String :* (Options :* FromArgs arity a)
forall a b. a -> b -> a :* b
:* Options
opts Options -> FromArgs arity a -> Options :* FromArgs arity a
forall a b. a -> b -> a :* b
:* FromArgs arity a
fargs)
where
tname :: String
tname = M1 Any d Any Any -> String
forall k (d :: k) k1 (t :: k -> (k1 -> *) -> k1 -> *)
(f :: k1 -> *) (a :: k1).
Datatype d =>
t d f a -> String
moduleName M1 Any d Any Any
proxy String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
"." String -> String -> String
forall a. [a] -> [a] -> [a]
++ M1 Any d Any Any -> String
forall k (d :: k) k1 (t :: k -> (k1 -> *) -> k1 -> *)
(f :: k1 -> *) (a :: k1).
Datatype d =>
t d f a -> String
datatypeName M1 Any d Any Any
proxy
proxy :: M1 Any d Any Any
proxy = forall k _i (_f :: k -> *) (_p :: k). M1 _i d _f _p
forall a. HasCallStack => a
undefined :: M1 _i d _f _p
class GFromJSON' arity f where
gParseJSON' :: TypeName :* Options :* FromArgs arity a
-> Value
-> Parser (f a)
instance ( ConsFromJSON arity a
, AllNullary (C1 c a) allNullary
, ParseSum arity (C1 c a) allNullary
, Constructor c
) => GFromJSON' arity (C1 c a) where
gParseJSON' :: (String :* (Options :* FromArgs arity a))
-> Value -> Parser (C1 c a a)
gParseJSON' p :: String :* (Options :* FromArgs arity a)
p@(String
_ :* Options
opts :* FromArgs arity a
_)
| Options -> Bool
tagSingleConstructors Options
opts
= (forall p.
Tagged allNullary (Parser (C1 c a p)) -> Parser (C1 c a p)
forall k (s :: k) b. Tagged s b -> b
unTagged :: Tagged allNullary (Parser (C1 c a p)) -> Parser (C1 c a p))
(Tagged allNullary (Parser (C1 c a a)) -> Parser (C1 c a a))
-> (Value -> Tagged allNullary (Parser (C1 c a a)))
-> Value
-> Parser (C1 c a a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (String :* (Options :* FromArgs arity a))
-> Value -> Tagged allNullary (Parser (C1 c a a))
forall k arity (f :: * -> *) (allNullary :: k) a.
ParseSum arity f allNullary =>
(String :* (Options :* FromArgs arity a))
-> Value -> Tagged allNullary (Parser (f a))
parseSum String :* (Options :* FromArgs arity a)
p
| Bool
otherwise = (a a -> C1 c a a) -> Parser (a a) -> Parser (C1 c a a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap a a -> C1 c a a
forall k i (c :: Meta) (f :: k -> *) (p :: k). f p -> M1 i c f p
M1 (Parser (a a) -> Parser (C1 c a a))
-> (Value -> Parser (a a)) -> Value -> Parser (C1 c a a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (String :* (String :* (Options :* FromArgs arity a)))
-> Value -> Parser (a a)
forall arity (f :: * -> *) a.
ConsFromJSON arity f =>
(String :* (String :* (Options :* FromArgs arity a)))
-> Value -> Parser (f a)
consParseJSON (String
cname String
-> (String :* (Options :* FromArgs arity a))
-> String :* (String :* (Options :* FromArgs arity a))
forall a b. a -> b -> a :* b
:* String :* (Options :* FromArgs arity a)
p)
where
cname :: String
cname = M1 Any c Any Any -> String
forall k (c :: k) k1 (t :: k -> (k1 -> *) -> k1 -> *)
(f :: k1 -> *) (a :: k1).
Constructor c =>
t c f a -> String
conName (forall k _i (_f :: k -> *) (_p :: k). M1 _i c _f _p
forall a. HasCallStack => a
undefined :: M1 _i c _f _p)
instance ( AllNullary (a :+: b) allNullary
, ParseSum arity (a :+: b) allNullary
) => GFromJSON' arity (a :+: b) where
gParseJSON' :: (String :* (Options :* FromArgs arity a))
-> Value -> Parser ((:+:) a b a)
gParseJSON' String :* (Options :* FromArgs arity a)
p =
(forall _d.
Tagged allNullary (Parser ((:+:) a b _d)) -> Parser ((:+:) a b _d)
forall k (s :: k) b. Tagged s b -> b
unTagged :: Tagged allNullary (Parser ((a :+: b) _d)) ->
Parser ((a :+: b) _d))
(Tagged allNullary (Parser ((:+:) a b a)) -> Parser ((:+:) a b a))
-> (Value -> Tagged allNullary (Parser ((:+:) a b a)))
-> Value
-> Parser ((:+:) a b a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (String :* (Options :* FromArgs arity a))
-> Value -> Tagged allNullary (Parser ((:+:) a b a))
forall k arity (f :: * -> *) (allNullary :: k) a.
ParseSum arity f allNullary =>
(String :* (Options :* FromArgs arity a))
-> Value -> Tagged allNullary (Parser (f a))
parseSum String :* (Options :* FromArgs arity a)
p
class ParseSum arity f allNullary where
parseSum :: TypeName :* Options :* FromArgs arity a
-> Value
-> Tagged allNullary (Parser (f a))
instance ( ConstructorNames f
, SumFromString f
, FromPair arity f
, FromTaggedObject arity f
, FromUntaggedValue arity f
) => ParseSum arity f True where
parseSum :: (String :* (Options :* FromArgs arity a))
-> Value -> Tagged True (Parser (f a))
parseSum p :: String :* (Options :* FromArgs arity a)
p@(String
tname :* Options
opts :* FromArgs arity a
_)
| Options -> Bool
allNullaryToStringTag Options
opts = Parser (f a) -> Tagged True (Parser (f a))
forall k (s :: k) b. b -> Tagged s b
Tagged (Parser (f a) -> Tagged True (Parser (f a)))
-> (Value -> Parser (f a)) -> Value -> Tagged True (Parser (f a))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> Options -> Value -> Parser (f a)
forall (f :: * -> *) a.
(SumFromString f, ConstructorNames f) =>
String -> Options -> Value -> Parser (f a)
parseAllNullarySum String
tname Options
opts
| Bool
otherwise = Parser (f a) -> Tagged True (Parser (f a))
forall k (s :: k) b. b -> Tagged s b
Tagged (Parser (f a) -> Tagged True (Parser (f a)))
-> (Value -> Parser (f a)) -> Value -> Tagged True (Parser (f a))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (String :* (Options :* FromArgs arity a)) -> Value -> Parser (f a)
forall (f :: * -> *) c arity.
(FromPair arity f, FromTaggedObject arity f,
FromUntaggedValue arity f, ConstructorNames f) =>
(String :* (Options :* FromArgs arity c)) -> Value -> Parser (f c)
parseNonAllNullarySum String :* (Options :* FromArgs arity a)
p
instance ( ConstructorNames f
, FromPair arity f
, FromTaggedObject arity f
, FromUntaggedValue arity f
) => ParseSum arity f False where
parseSum :: (String :* (Options :* FromArgs arity a))
-> Value -> Tagged False (Parser (f a))
parseSum String :* (Options :* FromArgs arity a)
p = Parser (f a) -> Tagged False (Parser (f a))
forall k (s :: k) b. b -> Tagged s b
Tagged (Parser (f a) -> Tagged False (Parser (f a)))
-> (Value -> Parser (f a)) -> Value -> Tagged False (Parser (f a))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (String :* (Options :* FromArgs arity a)) -> Value -> Parser (f a)
forall (f :: * -> *) c arity.
(FromPair arity f, FromTaggedObject arity f,
FromUntaggedValue arity f, ConstructorNames f) =>
(String :* (Options :* FromArgs arity c)) -> Value -> Parser (f c)
parseNonAllNullarySum String :* (Options :* FromArgs arity a)
p
parseAllNullarySum :: (SumFromString f, ConstructorNames f)
=> TypeName -> Options -> Value -> Parser (f a)
parseAllNullarySum :: String -> Options -> Value -> Parser (f a)
parseAllNullarySum String
tname Options
opts =
String -> (Text -> Parser (f a)) -> Value -> Parser (f a)
forall a. String -> (Text -> Parser a) -> Value -> Parser a
withText String
tname ((Text -> Parser (f a)) -> Value -> Parser (f a))
-> (Text -> Parser (f a)) -> Value -> Parser (f a)
forall a b. (a -> b) -> a -> b
$ \Text
tag ->
Parser (f a)
-> (f a -> Parser (f a)) -> Maybe (f a) -> Parser (f a)
forall b a. b -> (a -> b) -> Maybe a -> b
maybe (Text -> Parser (f a)
badTag Text
tag) f a -> Parser (f a)
forall (m :: * -> *) a. Monad m => a -> m a
return (Maybe (f a) -> Parser (f a)) -> Maybe (f a) -> Parser (f a)
forall a b. (a -> b) -> a -> b
$
(String -> String) -> Text -> Maybe (f a)
forall k (f :: k -> *) (a :: k).
SumFromString f =>
(String -> String) -> Text -> Maybe (f a)
parseSumFromString String -> String
modifier Text
tag
where
badTag :: Text -> Parser (f a)
badTag Text
tag = String
-> (String -> String) -> ([String] -> String) -> Parser (f a)
forall (f :: * -> *) a t.
ConstructorNames f =>
String -> (String -> t) -> ([t] -> String) -> Parser (f a)
failWithCTags String
tname String -> String
modifier (([String] -> String) -> Parser (f a))
-> ([String] -> String) -> Parser (f a)
forall a b. (a -> b) -> a -> b
$ \[String]
cnames ->
String
"expected one of the tags " String -> String -> String
forall a. [a] -> [a] -> [a]
++ [String] -> String
forall a. Show a => a -> String
show [String]
cnames String -> String -> String
forall a. [a] -> [a] -> [a]
++
String
", but found tag " String -> String -> String
forall a. [a] -> [a] -> [a]
++ Text -> String
forall a. Show a => a -> String
show Text
tag
modifier :: String -> String
modifier = Options -> String -> String
constructorTagModifier Options
opts
failWithCTags
:: forall f a t. ConstructorNames f
=> TypeName -> (String -> t) -> ([t] -> String) -> Parser (f a)
failWithCTags :: String -> (String -> t) -> ([t] -> String) -> Parser (f a)
failWithCTags String
tname String -> t
modifier [t] -> String
f =
String -> Parser (f a) -> Parser (f a)
forall a. String -> Parser a -> Parser a
contextType String
tname (Parser (f a) -> Parser (f a))
-> (String -> Parser (f a)) -> String -> Parser (f a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> Parser (f a)
forall (m :: * -> *) a. MonadFail m => String -> m a
fail (String -> Parser (f a)) -> String -> Parser (f a)
forall a b. (a -> b) -> a -> b
$ [t] -> String
f [t]
cnames
where
cnames :: [t]
cnames = Tagged2 f [t] -> [t]
forall (s :: * -> *) b. Tagged2 s b -> b
unTagged2 ((String -> t) -> Tagged2 f [t]
forall (a :: * -> *) t.
ConstructorNames a =>
(String -> t) -> Tagged2 a [t]
constructorTags String -> t
modifier :: Tagged2 f [t])
class SumFromString f where
parseSumFromString :: (String -> String) -> Text -> Maybe (f a)
instance (SumFromString a, SumFromString b) => SumFromString (a :+: b) where
parseSumFromString :: (String -> String) -> Text -> Maybe ((:+:) a b a)
parseSumFromString String -> String
opts Text
key = (a a -> (:+:) a b a
forall k (f :: k -> *) (g :: k -> *) (p :: k). f p -> (:+:) f g p
L1 (a a -> (:+:) a b a) -> Maybe (a a) -> Maybe ((:+:) a b a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (String -> String) -> Text -> Maybe (a a)
forall k (f :: k -> *) (a :: k).
SumFromString f =>
(String -> String) -> Text -> Maybe (f a)
parseSumFromString String -> String
opts Text
key) Maybe ((:+:) a b a) -> Maybe ((:+:) a b a) -> Maybe ((:+:) a b a)
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|>
(b a -> (:+:) a b a
forall k (f :: k -> *) (g :: k -> *) (p :: k). g p -> (:+:) f g p
R1 (b a -> (:+:) a b a) -> Maybe (b a) -> Maybe ((:+:) a b a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (String -> String) -> Text -> Maybe (b a)
forall k (f :: k -> *) (a :: k).
SumFromString f =>
(String -> String) -> Text -> Maybe (f a)
parseSumFromString String -> String
opts Text
key)
instance (Constructor c) => SumFromString (C1 c U1) where
parseSumFromString :: (String -> String) -> Text -> Maybe (C1 c U1 a)
parseSumFromString String -> String
modifier Text
key
| Text
key Text -> Text -> Bool
forall a. Eq a => a -> a -> Bool
== Text
name = C1 c U1 a -> Maybe (C1 c U1 a)
forall a. a -> Maybe a
Just (C1 c U1 a -> Maybe (C1 c U1 a)) -> C1 c U1 a -> Maybe (C1 c U1 a)
forall a b. (a -> b) -> a -> b
$ U1 a -> C1 c U1 a
forall k i (c :: Meta) (f :: k -> *) (p :: k). f p -> M1 i c f p
M1 U1 a
forall k (p :: k). U1 p
U1
| Bool
otherwise = Maybe (C1 c U1 a)
forall a. Maybe a
Nothing
where
name :: Text
name = String -> Text
pack (String -> Text) -> String -> Text
forall a b. (a -> b) -> a -> b
$ String -> String
modifier (String -> String) -> String -> String
forall a b. (a -> b) -> a -> b
$ M1 Any c Any Any -> String
forall k (c :: k) k1 (t :: k -> (k1 -> *) -> k1 -> *)
(f :: k1 -> *) (a :: k1).
Constructor c =>
t c f a -> String
conName (forall k _i (_f :: k -> *) (_p :: k). M1 _i c _f _p
forall a. HasCallStack => a
undefined :: M1 _i c _f _p)
instance SumFromString a => SumFromString (D1 d a) where
parseSumFromString :: (String -> String) -> Text -> Maybe (D1 d a a)
parseSumFromString String -> String
modifier Text
key = a a -> D1 d a a
forall k i (c :: Meta) (f :: k -> *) (p :: k). f p -> M1 i c f p
M1 (a a -> D1 d a a) -> Maybe (a a) -> Maybe (D1 d a a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (String -> String) -> Text -> Maybe (a a)
forall k (f :: k -> *) (a :: k).
SumFromString f =>
(String -> String) -> Text -> Maybe (f a)
parseSumFromString String -> String
modifier Text
key
constructorTags :: ConstructorNames a => (String -> t) -> Tagged2 a [t]
constructorTags :: (String -> t) -> Tagged2 a [t]
constructorTags String -> t
modifier =
(DList t -> [t]) -> Tagged2 a (DList t) -> Tagged2 a [t]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap DList t -> [t]
forall a. DList a -> [a]
DList.toList ((String -> t) -> Tagged2 a (DList t)
forall (a :: * -> *) t.
ConstructorNames a =>
(String -> t) -> Tagged2 a (DList t)
constructorNames' String -> t
modifier)
class ConstructorNames a where
constructorNames' :: (String -> t) -> Tagged2 a (DList.DList t)
instance (ConstructorNames a, ConstructorNames b) => ConstructorNames (a :+: b) where
constructorNames' :: (String -> t) -> Tagged2 (a :+: b) (DList t)
constructorNames' = (Tagged2 a (DList t)
-> Tagged2 b (DList t) -> Tagged2 (a :+: b) (DList t))
-> ((String -> t) -> Tagged2 a (DList t))
-> ((String -> t) -> Tagged2 b (DList t))
-> (String -> t)
-> Tagged2 (a :+: b) (DList t)
forall (f :: * -> *) a b c.
Applicative f =>
(a -> b -> c) -> f a -> f b -> f c
liftA2 Tagged2 a (DList t)
-> Tagged2 b (DList t) -> Tagged2 (a :+: b) (DList t)
forall t.
Tagged2 a (DList t)
-> Tagged2 b (DList t) -> Tagged2 (a :+: b) (DList t)
append (String -> t) -> Tagged2 a (DList t)
forall (a :: * -> *) t.
ConstructorNames a =>
(String -> t) -> Tagged2 a (DList t)
constructorNames' (String -> t) -> Tagged2 b (DList t)
forall (a :: * -> *) t.
ConstructorNames a =>
(String -> t) -> Tagged2 a (DList t)
constructorNames'
where
append
:: Tagged2 a (DList.DList t)
-> Tagged2 b (DList.DList t)
-> Tagged2 (a :+: b) (DList.DList t)
append :: Tagged2 a (DList t)
-> Tagged2 b (DList t) -> Tagged2 (a :+: b) (DList t)
append (Tagged2 DList t
xs) (Tagged2 DList t
ys) = DList t -> Tagged2 (a :+: b) (DList t)
forall (s :: * -> *) b. b -> Tagged2 s b
Tagged2 (DList t -> DList t -> DList t
forall a. DList a -> DList a -> DList a
DList.append DList t
xs DList t
ys)
instance Constructor c => ConstructorNames (C1 c a) where
constructorNames' :: (String -> t) -> Tagged2 (C1 c a) (DList t)
constructorNames' String -> t
f = DList t -> Tagged2 (C1 c a) (DList t)
forall (s :: * -> *) b. b -> Tagged2 s b
Tagged2 (t -> DList t
forall (f :: * -> *) a. Applicative f => a -> f a
pure (String -> t
f String
cname))
where
cname :: String
cname = M1 Any c Any Any -> String
forall k (c :: k) k1 (t :: k -> (k1 -> *) -> k1 -> *)
(f :: k1 -> *) (a :: k1).
Constructor c =>
t c f a -> String
conName (forall k _i (_f :: k -> *) (_p :: k). M1 _i c _f _p
forall a. HasCallStack => a
undefined :: M1 _i c _f _p)
instance ConstructorNames a => ConstructorNames (D1 d a) where
constructorNames' :: (String -> t) -> Tagged2 (D1 d a) (DList t)
constructorNames' = Tagged2 a (DList t) -> Tagged2 (D1 d a) (DList t)
forall u. Tagged2 a u -> Tagged2 (D1 d a) u
retag (Tagged2 a (DList t) -> Tagged2 (D1 d a) (DList t))
-> ((String -> t) -> Tagged2 a (DList t))
-> (String -> t)
-> Tagged2 (D1 d a) (DList t)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (String -> t) -> Tagged2 a (DList t)
forall (a :: * -> *) t.
ConstructorNames a =>
(String -> t) -> Tagged2 a (DList t)
constructorNames'
where
retag :: Tagged2 a u -> Tagged2 (D1 d a) u
retag :: Tagged2 a u -> Tagged2 (D1 d a) u
retag (Tagged2 u
x) = u -> Tagged2 (D1 d a) u
forall (s :: * -> *) b. b -> Tagged2 s b
Tagged2 u
x
parseNonAllNullarySum :: forall f c arity.
( FromPair arity f
, FromTaggedObject arity f
, FromUntaggedValue arity f
, ConstructorNames f
) => TypeName :* Options :* FromArgs arity c
-> Value -> Parser (f c)
parseNonAllNullarySum :: (String :* (Options :* FromArgs arity c)) -> Value -> Parser (f c)
parseNonAllNullarySum p :: String :* (Options :* FromArgs arity c)
p@(String
tname :* Options
opts :* FromArgs arity c
_) =
case Options -> SumEncoding
sumEncoding Options
opts of
TaggedObject{String
contentsFieldName :: SumEncoding -> String
tagFieldName :: SumEncoding -> String
contentsFieldName :: String
tagFieldName :: String
..} ->
String -> (Object -> Parser (f c)) -> Value -> Parser (f c)
forall a. String -> (Object -> Parser a) -> Value -> Parser a
withObject String
tname ((Object -> Parser (f c)) -> Value -> Parser (f c))
-> (Object -> Parser (f c)) -> Value -> Parser (f c)
forall a b. (a -> b) -> a -> b
$ \Object
obj -> do
Text
tag <- String -> Parser Text -> Parser Text
forall a. String -> Parser a -> Parser a
contextType String
tname (Parser Text -> Parser Text)
-> (Parser Text -> Parser Text) -> Parser Text -> Parser Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> [String] -> Parser Text -> Parser Text
forall a. Text -> [String] -> Parser a -> Parser a
contextTag Text
tagKey [String]
cnames_ (Parser Text -> Parser Text) -> Parser Text -> Parser Text
forall a b. (a -> b) -> a -> b
$ Object
obj Object -> Text -> Parser Text
forall a. FromJSON a => Object -> Text -> Parser a
.: Text
tagKey
Parser (f c) -> Maybe (Parser (f c)) -> Parser (f c)
forall a. a -> Maybe a -> a
fromMaybe (Text -> Parser (f c)
badTag Text
tag Parser (f c) -> JSONPathElement -> Parser (f c)
forall a. Parser a -> JSONPathElement -> Parser a
<?> Text -> JSONPathElement
Key Text
tagKey) (Maybe (Parser (f c)) -> Parser (f c))
-> Maybe (Parser (f c)) -> Parser (f c)
forall a b. (a -> b) -> a -> b
$
(Text :* (String :* (String :* (Options :* FromArgs arity c))))
-> Object -> Maybe (Parser (f c))
forall arity (f :: * -> *) a.
FromTaggedObject arity f =>
(Text :* (String :* (String :* (Options :* FromArgs arity a))))
-> Object -> Maybe (Parser (f a))
parseFromTaggedObject (Text
tag Text
-> (String :* (String :* (Options :* FromArgs arity c)))
-> Text :* (String :* (String :* (Options :* FromArgs arity c)))
forall a b. a -> b -> a :* b
:* String
contentsFieldName String
-> (String :* (Options :* FromArgs arity c))
-> String :* (String :* (Options :* FromArgs arity c))
forall a b. a -> b -> a :* b
:* String :* (Options :* FromArgs arity c)
p) Object
obj
where
tagKey :: Text
tagKey = String -> Text
pack String
tagFieldName
badTag :: Text -> Parser (f c)
badTag Text
tag = ([String] -> String) -> Parser (f c)
failWith_ (([String] -> String) -> Parser (f c))
-> ([String] -> String) -> Parser (f c)
forall a b. (a -> b) -> a -> b
$ \[String]
cnames ->
String
"expected tag field to be one of " String -> String -> String
forall a. [a] -> [a] -> [a]
++ [String] -> String
forall a. Show a => a -> String
show [String]
cnames String -> String -> String
forall a. [a] -> [a] -> [a]
++
String
", but found tag " String -> String -> String
forall a. [a] -> [a] -> [a]
++ Text -> String
forall a. Show a => a -> String
show Text
tag
cnames_ :: [String]
cnames_ = Tagged2 f [String] -> [String]
forall (s :: * -> *) b. Tagged2 s b -> b
unTagged2 ((String -> String) -> Tagged2 f [String]
forall (a :: * -> *) t.
ConstructorNames a =>
(String -> t) -> Tagged2 a [t]
constructorTags (Options -> String -> String
constructorTagModifier Options
opts) :: Tagged2 f [String])
SumEncoding
ObjectWithSingleField ->
String -> (Object -> Parser (f c)) -> Value -> Parser (f c)
forall a. String -> (Object -> Parser a) -> Value -> Parser a
withObject String
tname ((Object -> Parser (f c)) -> Value -> Parser (f c))
-> (Object -> Parser (f c)) -> Value -> Parser (f c)
forall a b. (a -> b) -> a -> b
$ \Object
obj -> case Object -> [(Text, Value)]
forall k v. HashMap k v -> [(k, v)]
H.toList Object
obj of
[(Text
tag, Value
v)] -> Parser (f c)
-> (Parser (f c) -> Parser (f c))
-> Maybe (Parser (f c))
-> Parser (f c)
forall b a. b -> (a -> b) -> Maybe a -> b
maybe (Text -> Parser (f c)
badTag Text
tag) (Parser (f c) -> JSONPathElement -> Parser (f c)
forall a. Parser a -> JSONPathElement -> Parser a
<?> Text -> JSONPathElement
Key Text
tag) (Maybe (Parser (f c)) -> Parser (f c))
-> Maybe (Parser (f c)) -> Parser (f c)
forall a b. (a -> b) -> a -> b
$
(Text :* (String :* (Options :* FromArgs arity c)))
-> Value -> Maybe (Parser (f c))
forall arity (f :: * -> *) a.
FromPair arity f =>
(Text :* (String :* (Options :* FromArgs arity a)))
-> Value -> Maybe (Parser (f a))
parsePair (Text
tag Text
-> (String :* (Options :* FromArgs arity c))
-> Text :* (String :* (Options :* FromArgs arity c))
forall a b. a -> b -> a :* b
:* String :* (Options :* FromArgs arity c)
p) Value
v
[(Text, Value)]
_ -> String -> Parser (f c) -> Parser (f c)
forall a. String -> Parser a -> Parser a
contextType String
tname (Parser (f c) -> Parser (f c))
-> (String -> Parser (f c)) -> String -> Parser (f c)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> Parser (f c)
forall (m :: * -> *) a. MonadFail m => String -> m a
fail (String -> Parser (f c)) -> String -> Parser (f c)
forall a b. (a -> b) -> a -> b
$
String
"expected an Object with a single pair, but found " String -> String -> String
forall a. [a] -> [a] -> [a]
++
Int -> String
forall a. Show a => a -> String
show (Object -> Int
forall k v. HashMap k v -> Int
H.size Object
obj) String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
" pairs"
where
badTag :: Text -> Parser (f c)
badTag Text
tag = ([String] -> String) -> Parser (f c)
failWith_ (([String] -> String) -> Parser (f c))
-> ([String] -> String) -> Parser (f c)
forall a b. (a -> b) -> a -> b
$ \[String]
cnames ->
String
"expected an Object with a single pair where the tag is one of " String -> String -> String
forall a. [a] -> [a] -> [a]
++
[String] -> String
forall a. Show a => a -> String
show [String]
cnames String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
", but found tag " String -> String -> String
forall a. [a] -> [a] -> [a]
++ Text -> String
forall a. Show a => a -> String
show Text
tag
SumEncoding
TwoElemArray ->
String -> (Array -> Parser (f c)) -> Value -> Parser (f c)
forall a. String -> (Array -> Parser a) -> Value -> Parser a
withArray String
tname ((Array -> Parser (f c)) -> Value -> Parser (f c))
-> (Array -> Parser (f c)) -> Value -> Parser (f c)
forall a b. (a -> b) -> a -> b
$ \Array
arr -> case Array -> Int
forall a. Vector a -> Int
V.length Array
arr of
Int
2 | String Text
tag <- Array -> Int -> Value
forall a. Vector a -> Int -> a
V.unsafeIndex Array
arr Int
0 ->
Parser (f c)
-> (Parser (f c) -> Parser (f c))
-> Maybe (Parser (f c))
-> Parser (f c)
forall b a. b -> (a -> b) -> Maybe a -> b
maybe (Text -> Parser (f c)
badTag Text
tag Parser (f c) -> JSONPathElement -> Parser (f c)
forall a. Parser a -> JSONPathElement -> Parser a
<?> Int -> JSONPathElement
Index Int
0) (Parser (f c) -> JSONPathElement -> Parser (f c)
forall a. Parser a -> JSONPathElement -> Parser a
<?> Int -> JSONPathElement
Index Int
1) (Maybe (Parser (f c)) -> Parser (f c))
-> Maybe (Parser (f c)) -> Parser (f c)
forall a b. (a -> b) -> a -> b
$
(Text :* (String :* (Options :* FromArgs arity c)))
-> Value -> Maybe (Parser (f c))
forall arity (f :: * -> *) a.
FromPair arity f =>
(Text :* (String :* (Options :* FromArgs arity a)))
-> Value -> Maybe (Parser (f a))
parsePair (Text
tag Text
-> (String :* (Options :* FromArgs arity c))
-> Text :* (String :* (Options :* FromArgs arity c))
forall a b. a -> b -> a :* b
:* String :* (Options :* FromArgs arity c)
p) (Array -> Int -> Value
forall a. Vector a -> Int -> a
V.unsafeIndex Array
arr Int
1)
| Bool
otherwise ->
String -> Parser (f c) -> Parser (f c)
forall a. String -> Parser a -> Parser a
contextType String
tname (Parser (f c) -> Parser (f c)) -> Parser (f c) -> Parser (f c)
forall a b. (a -> b) -> a -> b
$
String -> Parser (f c)
forall (m :: * -> *) a. MonadFail m => String -> m a
fail String
"tag element is not a String" Parser (f c) -> JSONPathElement -> Parser (f c)
forall a. Parser a -> JSONPathElement -> Parser a
<?> Int -> JSONPathElement
Index Int
0
Int
len -> String -> Parser (f c) -> Parser (f c)
forall a. String -> Parser a -> Parser a
contextType String
tname (Parser (f c) -> Parser (f c))
-> (String -> Parser (f c)) -> String -> Parser (f c)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> Parser (f c)
forall (m :: * -> *) a. MonadFail m => String -> m a
fail (String -> Parser (f c)) -> String -> Parser (f c)
forall a b. (a -> b) -> a -> b
$
String
"expected a 2-element Array, but encountered an Array of length " String -> String -> String
forall a. [a] -> [a] -> [a]
++
Int -> String
forall a. Show a => a -> String
show Int
len
where
badTag :: Text -> Parser (f c)
badTag Text
tag = ([String] -> String) -> Parser (f c)
failWith_ (([String] -> String) -> Parser (f c))
-> ([String] -> String) -> Parser (f c)
forall a b. (a -> b) -> a -> b
$ \[String]
cnames ->
String
"expected tag of the 2-element Array to be one of " String -> String -> String
forall a. [a] -> [a] -> [a]
++
[String] -> String
forall a. Show a => a -> String
show [String]
cnames String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
", but found tag " String -> String -> String
forall a. [a] -> [a] -> [a]
++ Text -> String
forall a. Show a => a -> String
show Text
tag
SumEncoding
UntaggedValue -> (String :* (Options :* FromArgs arity c)) -> Value -> Parser (f c)
forall arity (f :: * -> *) a.
FromUntaggedValue arity f =>
(String :* (Options :* FromArgs arity a)) -> Value -> Parser (f a)
parseUntaggedValue String :* (Options :* FromArgs arity c)
p
where
failWith_ :: ([String] -> String) -> Parser (f c)
failWith_ = String
-> (String -> String) -> ([String] -> String) -> Parser (f c)
forall (f :: * -> *) a t.
ConstructorNames f =>
String -> (String -> t) -> ([t] -> String) -> Parser (f a)
failWithCTags String
tname (Options -> String -> String
constructorTagModifier Options
opts)
class FromTaggedObject arity f where
parseFromTaggedObject
:: Text :* String :* TypeName :* Options :* FromArgs arity a
-> Object
-> Maybe (Parser (f a))
instance ( FromTaggedObject arity a, FromTaggedObject arity b) =>
FromTaggedObject arity (a :+: b) where
parseFromTaggedObject :: (Text :* (String :* (String :* (Options :* FromArgs arity a))))
-> Object -> Maybe (Parser ((:+:) a b a))
parseFromTaggedObject Text :* (String :* (String :* (Options :* FromArgs arity a)))
p Object
obj =
((a a -> (:+:) a b a) -> Parser (a a) -> Parser ((:+:) a b a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap a a -> (:+:) a b a
forall k (f :: k -> *) (g :: k -> *) (p :: k). f p -> (:+:) f g p
L1 (Parser (a a) -> Parser ((:+:) a b a))
-> Maybe (Parser (a a)) -> Maybe (Parser ((:+:) a b a))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Text :* (String :* (String :* (Options :* FromArgs arity a))))
-> Object -> Maybe (Parser (a a))
forall arity (f :: * -> *) a.
FromTaggedObject arity f =>
(Text :* (String :* (String :* (Options :* FromArgs arity a))))
-> Object -> Maybe (Parser (f a))
parseFromTaggedObject Text :* (String :* (String :* (Options :* FromArgs arity a)))
p Object
obj) Maybe (Parser ((:+:) a b a))
-> Maybe (Parser ((:+:) a b a)) -> Maybe (Parser ((:+:) a b a))
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|>
((b a -> (:+:) a b a) -> Parser (b a) -> Parser ((:+:) a b a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap b a -> (:+:) a b a
forall k (f :: k -> *) (g :: k -> *) (p :: k). g p -> (:+:) f g p
R1 (Parser (b a) -> Parser ((:+:) a b a))
-> Maybe (Parser (b a)) -> Maybe (Parser ((:+:) a b a))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Text :* (String :* (String :* (Options :* FromArgs arity a))))
-> Object -> Maybe (Parser (b a))
forall arity (f :: * -> *) a.
FromTaggedObject arity f =>
(Text :* (String :* (String :* (Options :* FromArgs arity a))))
-> Object -> Maybe (Parser (f a))
parseFromTaggedObject Text :* (String :* (String :* (Options :* FromArgs arity a)))
p Object
obj)
instance ( IsRecord f isRecord
, FromTaggedObject' arity f isRecord
, Constructor c
) => FromTaggedObject arity (C1 c f) where
parseFromTaggedObject :: (Text :* (String :* (String :* (Options :* FromArgs arity a))))
-> Object -> Maybe (Parser (C1 c f a))
parseFromTaggedObject (Text
tag :* String
contentsFieldName :* p :: String :* (Options :* FromArgs arity a)
p@(String
_ :* Options
opts :* FromArgs arity a
_))
| Text
tag Text -> Text -> Bool
forall a. Eq a => a -> a -> Bool
== Text
tag'
= Parser (C1 c f a) -> Maybe (Parser (C1 c f a))
forall a. a -> Maybe a
Just (Parser (C1 c f a) -> Maybe (Parser (C1 c f a)))
-> (Object -> Parser (C1 c f a))
-> Object
-> Maybe (Parser (C1 c f a))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (f a -> C1 c f a) -> Parser (f a) -> Parser (C1 c f a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap f a -> C1 c f a
forall k i (c :: Meta) (f :: k -> *) (p :: k). f p -> M1 i c f p
M1 (Parser (f a) -> Parser (C1 c f a))
-> (Object -> Parser (f a)) -> Object -> Parser (C1 c f a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
(forall a. Tagged isRecord (Parser (f a)) -> Parser (f a)
forall k (s :: k) b. Tagged s b -> b
unTagged :: Tagged isRecord (Parser (f a)) -> Parser (f a)) (Tagged isRecord (Parser (f a)) -> Parser (f a))
-> (Object -> Tagged isRecord (Parser (f a)))
-> Object
-> Parser (f a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
(String :* (String :* (String :* (Options :* FromArgs arity a))))
-> Object -> Tagged isRecord (Parser (f a))
forall k arity (f :: * -> *) (isRecord :: k) a.
FromTaggedObject' arity f isRecord =>
(String :* (String :* (String :* (Options :* FromArgs arity a))))
-> Object -> Tagged isRecord (Parser (f a))
parseFromTaggedObject' (String
contentsFieldName String
-> (String :* (String :* (Options :* FromArgs arity a)))
-> String :* (String :* (String :* (Options :* FromArgs arity a)))
forall a b. a -> b -> a :* b
:* String
cname String
-> (String :* (Options :* FromArgs arity a))
-> String :* (String :* (Options :* FromArgs arity a))
forall a b. a -> b -> a :* b
:* String :* (Options :* FromArgs arity a)
p)
| Bool
otherwise = Maybe (Parser (C1 c f a)) -> Object -> Maybe (Parser (C1 c f a))
forall a b. a -> b -> a
const Maybe (Parser (C1 c f a))
forall a. Maybe a
Nothing
where
tag' :: Text
tag' = String -> Text
pack (String -> Text) -> String -> Text
forall a b. (a -> b) -> a -> b
$ Options -> String -> String
constructorTagModifier Options
opts String
cname
cname :: String
cname = M1 Any c Any Any -> String
forall k (c :: k) k1 (t :: k -> (k1 -> *) -> k1 -> *)
(f :: k1 -> *) (a :: k1).
Constructor c =>
t c f a -> String
conName (forall k _i (_f :: k -> *) (_p :: k). M1 _i c _f _p
forall a. HasCallStack => a
undefined :: M1 _i c _f _p)
class FromTaggedObject' arity f isRecord where
parseFromTaggedObject'
:: String :* ConName :* TypeName :* Options :* FromArgs arity a
-> Object -> Tagged isRecord (Parser (f a))
instance (RecordFromJSON arity f, FieldNames f) => FromTaggedObject' arity f True where
parseFromTaggedObject' :: (String :* (String :* (String :* (Options :* FromArgs arity a))))
-> Object -> Tagged True (Parser (f a))
parseFromTaggedObject' (String
_ :* String :* (String :* (Options :* FromArgs arity a))
p) = Parser (f a) -> Tagged True (Parser (f a))
forall k (s :: k) b. b -> Tagged s b
Tagged (Parser (f a) -> Tagged True (Parser (f a)))
-> (Object -> Parser (f a)) -> Object -> Tagged True (Parser (f a))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Bool :* (String :* (String :* (Options :* FromArgs arity a))))
-> Object -> Parser (f a)
forall arity (f :: * -> *) a.
RecordFromJSON arity f =>
(Bool :* (String :* (String :* (Options :* FromArgs arity a))))
-> Object -> Parser (f a)
recordParseJSON (Bool
True Bool
-> (String :* (String :* (Options :* FromArgs arity a)))
-> Bool :* (String :* (String :* (Options :* FromArgs arity a)))
forall a b. a -> b -> a :* b
:* String :* (String :* (Options :* FromArgs arity a))
p)
instance (ConsFromJSON arity f) => FromTaggedObject' arity f False where
parseFromTaggedObject' :: (String :* (String :* (String :* (Options :* FromArgs arity a))))
-> Object -> Tagged False (Parser (f a))
parseFromTaggedObject' String :* (String :* (String :* (Options :* FromArgs arity a)))
p Object
obj = Parser (f a) -> Tagged False (Parser (f a))
forall k (s :: k) b. b -> Tagged s b
Tagged (Parser (f a) -> Tagged False (Parser (f a)))
-> Parser (f a) -> Tagged False (Parser (f a))
forall a b. (a -> b) -> a -> b
$ do
Value
contents <- String -> String -> Parser Value -> Parser Value
forall a. String -> String -> Parser a -> Parser a
contextCons String
cname String
tname (Object
obj Object -> Text -> Parser Value
forall a. FromJSON a => Object -> Text -> Parser a
.: Text
key)
(String :* (String :* (Options :* FromArgs arity a)))
-> Value -> Parser (f a)
forall arity (f :: * -> *) a.
ConsFromJSON arity f =>
(String :* (String :* (Options :* FromArgs arity a)))
-> Value -> Parser (f a)
consParseJSON String :* (String :* (Options :* FromArgs arity a))
p' Value
contents Parser (f a) -> JSONPathElement -> Parser (f a)
forall a. Parser a -> JSONPathElement -> Parser a
<?> Text -> JSONPathElement
Key Text
key
where
key :: Text
key = String -> Text
pack String
contentsFieldName
String
contentsFieldName :* p' :: String :* (String :* (Options :* FromArgs arity a))
p'@(String
cname :* String
tname :* Options :* FromArgs arity a
_) = String :* (String :* (String :* (Options :* FromArgs arity a)))
p
instance OVERLAPPING_ FromTaggedObject' arity U1 False where
parseFromTaggedObject' :: (String :* (String :* (String :* (Options :* FromArgs arity a))))
-> Object -> Tagged False (Parser (U1 a))
parseFromTaggedObject' String :* (String :* (String :* (Options :* FromArgs arity a)))
_ Object
_ = Parser (U1 a) -> Tagged False (Parser (U1 a))
forall k (s :: k) b. b -> Tagged s b
Tagged (U1 a -> Parser (U1 a)
forall (f :: * -> *) a. Applicative f => a -> f a
pure U1 a
forall k (p :: k). U1 p
U1)
class ConsFromJSON arity f where
consParseJSON
:: ConName :* TypeName :* Options :* FromArgs arity a
-> Value -> Parser (f a)
class ConsFromJSON' arity f isRecord where
consParseJSON'
:: ConName :* TypeName :* Options :* FromArgs arity a
-> Value -> Tagged isRecord (Parser (f a))
instance ( IsRecord f isRecord
, ConsFromJSON' arity f isRecord
) => ConsFromJSON arity f where
consParseJSON :: (String :* (String :* (Options :* FromArgs arity a)))
-> Value -> Parser (f a)
consParseJSON String :* (String :* (Options :* FromArgs arity a))
p =
(forall a. Tagged isRecord (Parser (f a)) -> Parser (f a)
forall k (s :: k) b. Tagged s b -> b
unTagged :: Tagged isRecord (Parser (f a)) -> Parser (f a))
(Tagged isRecord (Parser (f a)) -> Parser (f a))
-> (Value -> Tagged isRecord (Parser (f a)))
-> Value
-> Parser (f a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (String :* (String :* (Options :* FromArgs arity a)))
-> Value -> Tagged isRecord (Parser (f a))
forall k arity (f :: * -> *) (isRecord :: k) a.
ConsFromJSON' arity f isRecord =>
(String :* (String :* (Options :* FromArgs arity a)))
-> Value -> Tagged isRecord (Parser (f a))
consParseJSON' String :* (String :* (Options :* FromArgs arity a))
p
instance OVERLAPPING_
( GFromJSON arity a, RecordFromJSON arity (S1 s a)
) => ConsFromJSON' arity (S1 s a) True where
consParseJSON' :: (String :* (String :* (Options :* FromArgs arity a)))
-> Value -> Tagged True (Parser (S1 s a a))
consParseJSON' p :: String :* (String :* (Options :* FromArgs arity a))
p@(String
cname :* String
tname :* Options
opts :* FromArgs arity a
fargs)
| Options -> Bool
unwrapUnaryRecords Options
opts = Parser (S1 s a a) -> Tagged True (Parser (S1 s a a))
forall k (s :: k) b. b -> Tagged s b
Tagged (Parser (S1 s a a) -> Tagged True (Parser (S1 s a a)))
-> (Value -> Parser (S1 s a a))
-> Value
-> Tagged True (Parser (S1 s a a))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (a a -> S1 s a a) -> Parser (a a) -> Parser (S1 s a a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap a a -> S1 s a a
forall k i (c :: Meta) (f :: k -> *) (p :: k). f p -> M1 i c f p
M1 (Parser (a a) -> Parser (S1 s a a))
-> (Value -> Parser (a a)) -> Value -> Parser (S1 s a a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Options -> FromArgs arity a -> Value -> Parser (a a)
forall arity (f :: * -> *) a.
GFromJSON arity f =>
Options -> FromArgs arity a -> Value -> Parser (f a)
gParseJSON Options
opts FromArgs arity a
fargs
| Bool
otherwise = Parser (S1 s a a) -> Tagged True (Parser (S1 s a a))
forall k (s :: k) b. b -> Tagged s b
Tagged (Parser (S1 s a a) -> Tagged True (Parser (S1 s a a)))
-> (Value -> Parser (S1 s a a))
-> Value
-> Tagged True (Parser (S1 s a a))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String
-> (Object -> Parser (S1 s a a)) -> Value -> Parser (S1 s a a)
forall a. String -> (Object -> Parser a) -> Value -> Parser a
withObject (String -> String -> String
showCons String
cname String
tname) ((Bool :* (String :* (String :* (Options :* FromArgs arity a))))
-> Object -> Parser (S1 s a a)
forall arity (f :: * -> *) a.
RecordFromJSON arity f =>
(Bool :* (String :* (String :* (Options :* FromArgs arity a))))
-> Object -> Parser (f a)
recordParseJSON (Bool
False Bool
-> (String :* (String :* (Options :* FromArgs arity a)))
-> Bool :* (String :* (String :* (Options :* FromArgs arity a)))
forall a b. a -> b -> a :* b
:* String :* (String :* (Options :* FromArgs arity a))
p))
instance RecordFromJSON arity f => ConsFromJSON' arity f True where
consParseJSON' :: (String :* (String :* (Options :* FromArgs arity a)))
-> Value -> Tagged True (Parser (f a))
consParseJSON' p :: String :* (String :* (Options :* FromArgs arity a))
p@(String
cname :* String
tname :* Options :* FromArgs arity a
_) =
Parser (f a) -> Tagged True (Parser (f a))
forall k (s :: k) b. b -> Tagged s b
Tagged (Parser (f a) -> Tagged True (Parser (f a)))
-> (Value -> Parser (f a)) -> Value -> Tagged True (Parser (f a))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> (Object -> Parser (f a)) -> Value -> Parser (f a)
forall a. String -> (Object -> Parser a) -> Value -> Parser a
withObject (String -> String -> String
showCons String
cname String
tname) ((Bool :* (String :* (String :* (Options :* FromArgs arity a))))
-> Object -> Parser (f a)
forall arity (f :: * -> *) a.
RecordFromJSON arity f =>
(Bool :* (String :* (String :* (Options :* FromArgs arity a))))
-> Object -> Parser (f a)
recordParseJSON (Bool
False Bool
-> (String :* (String :* (Options :* FromArgs arity a)))
-> Bool :* (String :* (String :* (Options :* FromArgs arity a)))
forall a b. a -> b -> a :* b
:* String :* (String :* (Options :* FromArgs arity a))
p))
instance OVERLAPPING_
ConsFromJSON' arity U1 False where
consParseJSON' :: (String :* (String :* (Options :* FromArgs arity a)))
-> Value -> Tagged False (Parser (U1 a))
consParseJSON' (String
cname :* String
tname :* Options :* FromArgs arity a
_) Value
v =
Parser (U1 a) -> Tagged False (Parser (U1 a))
forall k (s :: k) b. b -> Tagged s b
Tagged (Parser (U1 a) -> Tagged False (Parser (U1 a)))
-> (Parser (U1 a) -> Parser (U1 a))
-> Parser (U1 a)
-> Tagged False (Parser (U1 a))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> String -> Parser (U1 a) -> Parser (U1 a)
forall a. String -> String -> Parser a -> Parser a
contextCons String
cname String
tname (Parser (U1 a) -> Tagged False (Parser (U1 a)))
-> Parser (U1 a) -> Tagged False (Parser (U1 a))
forall a b. (a -> b) -> a -> b
$ case Value
v of
Array Array
a | Array -> Bool
forall a. Vector a -> Bool
V.null Array
a -> U1 a -> Parser (U1 a)
forall (f :: * -> *) a. Applicative f => a -> f a
pure U1 a
forall k (p :: k). U1 p
U1
| Bool
otherwise -> Array -> Parser (U1 a)
forall (m :: * -> *) a a. MonadFail m => Vector a -> m a
fail_ Array
a
Value
_ -> String -> Value -> Parser (U1 a)
forall a. String -> Value -> Parser a
typeMismatch String
"Array" Value
v
where
fail_ :: Vector a -> m a
fail_ Vector a
a = String -> m a
forall (m :: * -> *) a. MonadFail m => String -> m a
fail (String -> m a) -> String -> m a
forall a b. (a -> b) -> a -> b
$
String
"expected an empty Array, but encountered an Array of length " String -> String -> String
forall a. [a] -> [a] -> [a]
++
Int -> String
forall a. Show a => a -> String
show (Vector a -> Int
forall a. Vector a -> Int
V.length Vector a
a)
instance OVERLAPPING_
GFromJSON arity f => ConsFromJSON' arity (S1 s f) False where
consParseJSON' :: (String :* (String :* (Options :* FromArgs arity a)))
-> Value -> Tagged False (Parser (S1 s f a))
consParseJSON' (String
_ :* String
_ :* Options
opts :* FromArgs arity a
fargs) =
Parser (S1 s f a) -> Tagged False (Parser (S1 s f a))
forall k (s :: k) b. b -> Tagged s b
Tagged (Parser (S1 s f a) -> Tagged False (Parser (S1 s f a)))
-> (Value -> Parser (S1 s f a))
-> Value
-> Tagged False (Parser (S1 s f a))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (f a -> S1 s f a) -> Parser (f a) -> Parser (S1 s f a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap f a -> S1 s f a
forall k i (c :: Meta) (f :: k -> *) (p :: k). f p -> M1 i c f p
M1 (Parser (f a) -> Parser (S1 s f a))
-> (Value -> Parser (f a)) -> Value -> Parser (S1 s f a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Options -> FromArgs arity a -> Value -> Parser (f a)
forall arity (f :: * -> *) a.
GFromJSON arity f =>
Options -> FromArgs arity a -> Value -> Parser (f a)
gParseJSON Options
opts FromArgs arity a
fargs
instance (ProductFromJSON arity f, ProductSize f
) => ConsFromJSON' arity f False where
consParseJSON' :: (String :* (String :* (Options :* FromArgs arity a)))
-> Value -> Tagged False (Parser (f a))
consParseJSON' String :* (String :* (Options :* FromArgs arity a))
p = Parser (f a) -> Tagged False (Parser (f a))
forall k (s :: k) b. b -> Tagged s b
Tagged (Parser (f a) -> Tagged False (Parser (f a)))
-> (Value -> Parser (f a)) -> Value -> Tagged False (Parser (f a))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (String :* (String :* (Options :* FromArgs arity a)))
-> Value -> Parser (f a)
forall (f :: * -> *) arity a.
(ProductFromJSON arity f, ProductSize f) =>
(String :* (String :* (Options :* FromArgs arity a)))
-> Value -> Parser (f a)
productParseJSON0 String :* (String :* (Options :* FromArgs arity a))
p
class FieldNames f where
fieldNames :: f a -> [String] -> [String]
instance (FieldNames a, FieldNames b) => FieldNames (a :*: b) where
fieldNames :: (:*:) a b a -> [String] -> [String]
fieldNames (:*:) a b a
_ =
a Any -> [String] -> [String]
forall k (f :: k -> *) (a :: k).
FieldNames f =>
f a -> [String] -> [String]
fieldNames (forall (x :: k). a x
forall a. HasCallStack => a
undefined :: a x) ([String] -> [String])
-> ([String] -> [String]) -> [String] -> [String]
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
b Any -> [String] -> [String]
forall k (f :: k -> *) (a :: k).
FieldNames f =>
f a -> [String] -> [String]
fieldNames (forall (y :: k). b y
forall a. HasCallStack => a
undefined :: b y)
instance (Selector s) => FieldNames (S1 s f) where
fieldNames :: S1 s f a -> [String] -> [String]
fieldNames S1 s f a
_ = (M1 Any s Any Any -> String
forall k (s :: k) k1 (t :: k -> (k1 -> *) -> k1 -> *)
(f :: k1 -> *) (a :: k1).
Selector s =>
t s f a -> String
selName (forall k _i (_f :: k -> *) (_p :: k). M1 _i s _f _p
forall a. HasCallStack => a
undefined :: M1 _i s _f _p) String -> [String] -> [String]
forall a. a -> [a] -> [a]
:)
class RecordFromJSON arity f where
recordParseJSON
:: Bool :* ConName :* TypeName :* Options :* FromArgs arity a
-> Object -> Parser (f a)
instance ( FieldNames f
, RecordFromJSON' arity f
) => RecordFromJSON arity f where
recordParseJSON :: (Bool :* (String :* (String :* (Options :* FromArgs arity a))))
-> Object -> Parser (f a)
recordParseJSON (Bool
fromTaggedSum :* p :: String :* (String :* (Options :* FromArgs arity a))
p@(String
cname :* String
tname :* Options
opts :* FromArgs arity a
_)) =
\Object
obj -> Object -> Parser ()
checkUnknown Object
obj Parser () -> Parser (f a) -> Parser (f a)
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> (String :* (String :* (Options :* FromArgs arity a)))
-> Object -> Parser (f a)
forall arity (f :: * -> *) a.
RecordFromJSON' arity f =>
(String :* (String :* (Options :* FromArgs arity a)))
-> Object -> Parser (f a)
recordParseJSON' String :* (String :* (Options :* FromArgs arity a))
p Object
obj
where
knownFields :: H.HashMap Text ()
knownFields :: HashMap Text ()
knownFields = [(Text, ())] -> HashMap Text ()
forall k v. (Eq k, Hashable k) => [(k, v)] -> HashMap k v
H.fromList ([(Text, ())] -> HashMap Text ())
-> [(Text, ())] -> HashMap Text ()
forall a b. (a -> b) -> a -> b
$ (String -> (Text, ())) -> [String] -> [(Text, ())]
forall a b. (a -> b) -> [a] -> [b]
map ((,()) (Text -> (Text, ())) -> (String -> Text) -> String -> (Text, ())
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> Text
pack) ([String] -> [(Text, ())]) -> [String] -> [(Text, ())]
forall a b. (a -> b) -> a -> b
$
[SumEncoding -> String
tagFieldName (Options -> SumEncoding
sumEncoding Options
opts) | Bool
fromTaggedSum] [String] -> [String] -> [String]
forall a. Semigroup a => a -> a -> a
<>
(Options -> String -> String
fieldLabelModifier Options
opts (String -> String) -> [String] -> [String]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> f Any -> [String] -> [String]
forall k (f :: k -> *) (a :: k).
FieldNames f =>
f a -> [String] -> [String]
fieldNames (forall a. f a
forall a. HasCallStack => a
undefined :: f a) [])
checkUnknown :: Object -> Parser ()
checkUnknown =
if Bool -> Bool
not (Options -> Bool
rejectUnknownFields Options
opts)
then \Object
_ -> () -> Parser ()
forall (m :: * -> *) a. Monad m => a -> m a
return ()
else \Object
obj -> case Object -> [Text]
forall k v. HashMap k v -> [k]
H.keys (Object -> HashMap Text () -> Object
forall k v w.
(Eq k, Hashable k) =>
HashMap k v -> HashMap k w -> HashMap k v
H.difference Object
obj HashMap Text ()
knownFields) of
[] -> () -> Parser ()
forall (m :: * -> *) a. Monad m => a -> m a
return ()
[Text]
unknownFields -> String -> String -> Parser () -> Parser ()
forall a. String -> String -> Parser a -> Parser a
contextCons String
cname String
tname (Parser () -> Parser ()) -> Parser () -> Parser ()
forall a b. (a -> b) -> a -> b
$
String -> Parser ()
forall (m :: * -> *) a. MonadFail m => String -> m a
fail (String
"unknown fields: " String -> String -> String
forall a. [a] -> [a] -> [a]
++ [Text] -> String
forall a. Show a => a -> String
show [Text]
unknownFields)
class RecordFromJSON' arity f where
recordParseJSON'
:: ConName :* TypeName :* Options :* FromArgs arity a
-> Object -> Parser (f a)
instance ( RecordFromJSON' arity a
, RecordFromJSON' arity b
) => RecordFromJSON' arity (a :*: b) where
recordParseJSON' :: (String :* (String :* (Options :* FromArgs arity a)))
-> Object -> Parser ((:*:) a b a)
recordParseJSON' String :* (String :* (Options :* FromArgs arity a))
p Object
obj =
a a -> b a -> (:*:) a b a
forall k (f :: k -> *) (g :: k -> *) (p :: k).
f p -> g p -> (:*:) f g p
(:*:) (a a -> b a -> (:*:) a b a)
-> Parser (a a) -> Parser (b a -> (:*:) a b a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (String :* (String :* (Options :* FromArgs arity a)))
-> Object -> Parser (a a)
forall arity (f :: * -> *) a.
RecordFromJSON' arity f =>
(String :* (String :* (Options :* FromArgs arity a)))
-> Object -> Parser (f a)
recordParseJSON' String :* (String :* (Options :* FromArgs arity a))
p Object
obj
Parser (b a -> (:*:) a b a) -> Parser (b a) -> Parser ((:*:) a b a)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (String :* (String :* (Options :* FromArgs arity a)))
-> Object -> Parser (b a)
forall arity (f :: * -> *) a.
RecordFromJSON' arity f =>
(String :* (String :* (Options :* FromArgs arity a)))
-> Object -> Parser (f a)
recordParseJSON' String :* (String :* (Options :* FromArgs arity a))
p Object
obj
instance OVERLAPPABLE_ (Selector s, GFromJSON arity a) =>
RecordFromJSON' arity (S1 s a) where
recordParseJSON' :: (String :* (String :* (Options :* FromArgs arity a)))
-> Object -> Parser (S1 s a a)
recordParseJSON' (String
cname :* String
tname :* Options
opts :* FromArgs arity a
fargs) Object
obj = do
Value
fv <- String -> String -> Parser Value -> Parser Value
forall a. String -> String -> Parser a -> Parser a
contextCons String
cname String
tname (Object
obj Object -> Text -> Parser Value
forall a. FromJSON a => Object -> Text -> Parser a
.: Text
label)
a a -> S1 s a a
forall k i (c :: Meta) (f :: k -> *) (p :: k). f p -> M1 i c f p
M1 (a a -> S1 s a a) -> Parser (a a) -> Parser (S1 s a a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Options -> FromArgs arity a -> Value -> Parser (a a)
forall arity (f :: * -> *) a.
GFromJSON arity f =>
Options -> FromArgs arity a -> Value -> Parser (f a)
gParseJSON Options
opts FromArgs arity a
fargs Value
fv Parser (a a) -> JSONPathElement -> Parser (a a)
forall a. Parser a -> JSONPathElement -> Parser a
<?> Text -> JSONPathElement
Key Text
label
where
label :: Text
label = String -> Text
pack (String -> Text) -> String -> Text
forall a b. (a -> b) -> a -> b
$ Options -> String -> String
fieldLabelModifier Options
opts String
sname
sname :: String
sname = M1 Any s Any Any -> String
forall k (s :: k) k1 (t :: k -> (k1 -> *) -> k1 -> *)
(f :: k1 -> *) (a :: k1).
Selector s =>
t s f a -> String
selName (forall k _i (_f :: k -> *) (_p :: k). M1 _i s _f _p
forall a. HasCallStack => a
undefined :: M1 _i s _f _p)
instance INCOHERENT_ (Selector s, FromJSON a) =>
RecordFromJSON' arity (S1 s (K1 i (Maybe a))) where
recordParseJSON' :: (String :* (String :* (Options :* FromArgs arity a)))
-> Object -> Parser (S1 s (K1 i (Maybe a)) a)
recordParseJSON' (String
_ :* String
_ :* Options
opts :* FromArgs arity a
_) Object
obj = K1 i (Maybe a) a -> S1 s (K1 i (Maybe a)) a
forall k i (c :: Meta) (f :: k -> *) (p :: k). f p -> M1 i c f p
M1 (K1 i (Maybe a) a -> S1 s (K1 i (Maybe a)) a)
-> (Maybe a -> K1 i (Maybe a) a)
-> Maybe a
-> S1 s (K1 i (Maybe a)) a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Maybe a -> K1 i (Maybe a) a
forall k i c (p :: k). c -> K1 i c p
K1 (Maybe a -> S1 s (K1 i (Maybe a)) a)
-> Parser (Maybe a) -> Parser (S1 s (K1 i (Maybe a)) a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Object
obj Object -> Text -> Parser (Maybe a)
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
.:? String -> Text
pack String
label
where
label :: String
label = Options -> String -> String
fieldLabelModifier Options
opts String
sname
sname :: String
sname = M1 Any s Any Any -> String
forall k (s :: k) k1 (t :: k -> (k1 -> *) -> k1 -> *)
(f :: k1 -> *) (a :: k1).
Selector s =>
t s f a -> String
selName (forall k _i (_f :: k -> *) (_p :: k). M1 _i s _f _p
forall a. HasCallStack => a
undefined :: M1 _i s _f _p)
instance INCOHERENT_ (Selector s, FromJSON a) =>
RecordFromJSON' arity (S1 s (K1 i (Semigroup.Option a))) where
recordParseJSON' :: (String :* (String :* (Options :* FromArgs arity a)))
-> Object -> Parser (S1 s (K1 i (Option a)) a)
recordParseJSON' String :* (String :* (Options :* FromArgs arity a))
p Object
obj = S1 s (K1 i (Maybe a)) a -> S1 s (K1 i (Option a)) a
forall k (p :: k).
S1 s (K1 i (Maybe a)) p -> S1 s (K1 i (Option a)) p
wrap (S1 s (K1 i (Maybe a)) a -> S1 s (K1 i (Option a)) a)
-> Parser (S1 s (K1 i (Maybe a)) a)
-> Parser (S1 s (K1 i (Option a)) a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (String :* (String :* (Options :* FromArgs arity a)))
-> Object -> Parser (S1 s (K1 i (Maybe a)) a)
forall arity (f :: * -> *) a.
RecordFromJSON' arity f =>
(String :* (String :* (Options :* FromArgs arity a)))
-> Object -> Parser (f a)
recordParseJSON' String :* (String :* (Options :* FromArgs arity a))
p Object
obj
where
wrap :: S1 s (K1 i (Maybe a)) p -> S1 s (K1 i (Semigroup.Option a)) p
wrap :: S1 s (K1 i (Maybe a)) p -> S1 s (K1 i (Option a)) p
wrap (M1 (K1 Maybe a
a)) = K1 i (Option a) p -> S1 s (K1 i (Option a)) p
forall k i (c :: Meta) (f :: k -> *) (p :: k). f p -> M1 i c f p
M1 (Option a -> K1 i (Option a) p
forall k i c (p :: k). c -> K1 i c p
K1 (Maybe a -> Option a
forall a. Maybe a -> Option a
Semigroup.Option Maybe a
a))
productParseJSON0
:: forall f arity a. (ProductFromJSON arity f, ProductSize f)
=> ConName :* TypeName :* Options :* FromArgs arity a
-> Value -> Parser (f a)
productParseJSON0 :: (String :* (String :* (Options :* FromArgs arity a)))
-> Value -> Parser (f a)
productParseJSON0 p :: String :* (String :* (Options :* FromArgs arity a))
p@(String
cname :* String
tname :* Options
_ :* FromArgs arity a
_) =
String -> (Array -> Parser (f a)) -> Value -> Parser (f a)
forall a. String -> (Array -> Parser a) -> Value -> Parser a
withArray (String -> String -> String
showCons String
cname String
tname) ((Array -> Parser (f a)) -> Value -> Parser (f a))
-> (Array -> Parser (f a)) -> Value -> Parser (f a)
forall a b. (a -> b) -> a -> b
$ \Array
arr ->
let lenArray :: Int
lenArray = Array -> Int
forall a. Vector a -> Int
V.length Array
arr
lenProduct :: Int
lenProduct = (Tagged2 f Int -> Int
forall (s :: * -> *) b. Tagged2 s b -> b
unTagged2 :: Tagged2 f Int -> Int)
Tagged2 f Int
forall (f :: * -> *). ProductSize f => Tagged2 f Int
productSize in
if Int
lenArray Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
lenProduct
then (String :* (String :* (Options :* FromArgs arity a)))
-> Array -> Int -> Int -> Parser (f a)
forall arity (f :: * -> *) a.
ProductFromJSON arity f =>
(String :* (String :* (Options :* FromArgs arity a)))
-> Array -> Int -> Int -> Parser (f a)
productParseJSON String :* (String :* (Options :* FromArgs arity a))
p Array
arr Int
0 Int
lenProduct
else String -> String -> Parser (f a) -> Parser (f a)
forall a. String -> String -> Parser a -> Parser a
contextCons String
cname String
tname (Parser (f a) -> Parser (f a)) -> Parser (f a) -> Parser (f a)
forall a b. (a -> b) -> a -> b
$
String -> Parser (f a)
forall (m :: * -> *) a. MonadFail m => String -> m a
fail (String -> Parser (f a)) -> String -> Parser (f a)
forall a b. (a -> b) -> a -> b
$ String
"expected an Array of length " String -> String -> String
forall a. [a] -> [a] -> [a]
++ Int -> String
forall a. Show a => a -> String
show Int
lenProduct String -> String -> String
forall a. [a] -> [a] -> [a]
++
String
", but encountered an Array of length " String -> String -> String
forall a. [a] -> [a] -> [a]
++ Int -> String
forall a. Show a => a -> String
show Int
lenArray
class ProductFromJSON arity f where
productParseJSON :: ConName :* TypeName :* Options :* FromArgs arity a
-> Array -> Int -> Int
-> Parser (f a)
instance ( ProductFromJSON arity a
, ProductFromJSON arity b
) => ProductFromJSON arity (a :*: b) where
productParseJSON :: (String :* (String :* (Options :* FromArgs arity a)))
-> Array -> Int -> Int -> Parser ((:*:) a b a)
productParseJSON String :* (String :* (Options :* FromArgs arity a))
p Array
arr Int
ix Int
len =
a a -> b a -> (:*:) a b a
forall k (f :: k -> *) (g :: k -> *) (p :: k).
f p -> g p -> (:*:) f g p
(:*:) (a a -> b a -> (:*:) a b a)
-> Parser (a a) -> Parser (b a -> (:*:) a b a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (String :* (String :* (Options :* FromArgs arity a)))
-> Array -> Int -> Int -> Parser (a a)
forall arity (f :: * -> *) a.
ProductFromJSON arity f =>
(String :* (String :* (Options :* FromArgs arity a)))
-> Array -> Int -> Int -> Parser (f a)
productParseJSON String :* (String :* (Options :* FromArgs arity a))
p Array
arr Int
ix Int
lenL
Parser (b a -> (:*:) a b a) -> Parser (b a) -> Parser ((:*:) a b a)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (String :* (String :* (Options :* FromArgs arity a)))
-> Array -> Int -> Int -> Parser (b a)
forall arity (f :: * -> *) a.
ProductFromJSON arity f =>
(String :* (String :* (Options :* FromArgs arity a)))
-> Array -> Int -> Int -> Parser (f a)
productParseJSON String :* (String :* (Options :* FromArgs arity a))
p Array
arr Int
ixR Int
lenR
where
lenL :: Int
lenL = Int
len Int -> Int -> Int
forall a. Bits a => a -> Int -> a
`unsafeShiftR` Int
1
ixR :: Int
ixR = Int
ix Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
lenL
lenR :: Int
lenR = Int
len Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
lenL
instance (GFromJSON arity a) => ProductFromJSON arity (S1 s a) where
productParseJSON :: (String :* (String :* (Options :* FromArgs arity a)))
-> Array -> Int -> Int -> Parser (S1 s a a)
productParseJSON (String
_ :* String
_ :* Options
opts :* FromArgs arity a
fargs) Array
arr Int
ix Int
_ =
a a -> S1 s a a
forall k i (c :: Meta) (f :: k -> *) (p :: k). f p -> M1 i c f p
M1 (a a -> S1 s a a) -> Parser (a a) -> Parser (S1 s a a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Options -> FromArgs arity a -> Value -> Parser (a a)
forall arity (f :: * -> *) a.
GFromJSON arity f =>
Options -> FromArgs arity a -> Value -> Parser (f a)
gParseJSON Options
opts FromArgs arity a
fargs (Array -> Int -> Value
forall a. Vector a -> Int -> a
V.unsafeIndex Array
arr Int
ix) Parser (a a) -> JSONPathElement -> Parser (a a)
forall a. Parser a -> JSONPathElement -> Parser a
<?> Int -> JSONPathElement
Index Int
ix
class FromPair arity f where
parsePair :: Text :* TypeName :* Options :* FromArgs arity a
-> Value
-> Maybe (Parser (f a))
instance ( FromPair arity a
, FromPair arity b
) => FromPair arity (a :+: b) where
parsePair :: (Text :* (String :* (Options :* FromArgs arity a)))
-> Value -> Maybe (Parser ((:+:) a b a))
parsePair Text :* (String :* (Options :* FromArgs arity a))
p Value
pair =
((a a -> (:+:) a b a) -> Parser (a a) -> Parser ((:+:) a b a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap a a -> (:+:) a b a
forall k (f :: k -> *) (g :: k -> *) (p :: k). f p -> (:+:) f g p
L1 (Parser (a a) -> Parser ((:+:) a b a))
-> Maybe (Parser (a a)) -> Maybe (Parser ((:+:) a b a))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Text :* (String :* (Options :* FromArgs arity a)))
-> Value -> Maybe (Parser (a a))
forall arity (f :: * -> *) a.
FromPair arity f =>
(Text :* (String :* (Options :* FromArgs arity a)))
-> Value -> Maybe (Parser (f a))
parsePair Text :* (String :* (Options :* FromArgs arity a))
p Value
pair) Maybe (Parser ((:+:) a b a))
-> Maybe (Parser ((:+:) a b a)) -> Maybe (Parser ((:+:) a b a))
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|>
((b a -> (:+:) a b a) -> Parser (b a) -> Parser ((:+:) a b a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap b a -> (:+:) a b a
forall k (f :: k -> *) (g :: k -> *) (p :: k). g p -> (:+:) f g p
R1 (Parser (b a) -> Parser ((:+:) a b a))
-> Maybe (Parser (b a)) -> Maybe (Parser ((:+:) a b a))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Text :* (String :* (Options :* FromArgs arity a)))
-> Value -> Maybe (Parser (b a))
forall arity (f :: * -> *) a.
FromPair arity f =>
(Text :* (String :* (Options :* FromArgs arity a)))
-> Value -> Maybe (Parser (f a))
parsePair Text :* (String :* (Options :* FromArgs arity a))
p Value
pair)
instance ( Constructor c
, ConsFromJSON arity a
) => FromPair arity (C1 c a) where
parsePair :: (Text :* (String :* (Options :* FromArgs arity a)))
-> Value -> Maybe (Parser (C1 c a a))
parsePair (Text
tag :* p :: String :* (Options :* FromArgs arity a)
p@(String
_ :* Options
opts :* FromArgs arity a
_)) Value
v
| Text
tag Text -> Text -> Bool
forall a. Eq a => a -> a -> Bool
== Text
tag' = Parser (C1 c a a) -> Maybe (Parser (C1 c a a))
forall a. a -> Maybe a
Just (Parser (C1 c a a) -> Maybe (Parser (C1 c a a)))
-> Parser (C1 c a a) -> Maybe (Parser (C1 c a a))
forall a b. (a -> b) -> a -> b
$ a a -> C1 c a a
forall k i (c :: Meta) (f :: k -> *) (p :: k). f p -> M1 i c f p
M1 (a a -> C1 c a a) -> Parser (a a) -> Parser (C1 c a a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (String :* (String :* (Options :* FromArgs arity a)))
-> Value -> Parser (a a)
forall arity (f :: * -> *) a.
ConsFromJSON arity f =>
(String :* (String :* (Options :* FromArgs arity a)))
-> Value -> Parser (f a)
consParseJSON (String
cname String
-> (String :* (Options :* FromArgs arity a))
-> String :* (String :* (Options :* FromArgs arity a))
forall a b. a -> b -> a :* b
:* String :* (Options :* FromArgs arity a)
p) Value
v
| Bool
otherwise = Maybe (Parser (C1 c a a))
forall a. Maybe a
Nothing
where
tag' :: Text
tag' = String -> Text
pack (String -> Text) -> String -> Text
forall a b. (a -> b) -> a -> b
$ Options -> String -> String
constructorTagModifier Options
opts String
cname
cname :: String
cname = M1 Any c Any Any -> String
forall k (c :: k) k1 (t :: k -> (k1 -> *) -> k1 -> *)
(f :: k1 -> *) (a :: k1).
Constructor c =>
t c f a -> String
conName (forall k _i (_a :: k -> *) (_p :: k). M1 _i c _a _p
forall a. HasCallStack => a
undefined :: M1 _i c _a _p)
class FromUntaggedValue arity f where
parseUntaggedValue :: TypeName :* Options :* FromArgs arity a
-> Value
-> Parser (f a)
instance
( FromUntaggedValue arity a
, FromUntaggedValue arity b
) => FromUntaggedValue arity (a :+: b)
where
parseUntaggedValue :: (String :* (Options :* FromArgs arity a))
-> Value -> Parser ((:+:) a b a)
parseUntaggedValue String :* (Options :* FromArgs arity a)
p Value
value =
a a -> (:+:) a b a
forall k (f :: k -> *) (g :: k -> *) (p :: k). f p -> (:+:) f g p
L1 (a a -> (:+:) a b a) -> Parser (a a) -> Parser ((:+:) a b a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (String :* (Options :* FromArgs arity a)) -> Value -> Parser (a a)
forall arity (f :: * -> *) a.
FromUntaggedValue arity f =>
(String :* (Options :* FromArgs arity a)) -> Value -> Parser (f a)
parseUntaggedValue String :* (Options :* FromArgs arity a)
p Value
value Parser ((:+:) a b a)
-> Parser ((:+:) a b a) -> Parser ((:+:) a b a)
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|>
b a -> (:+:) a b a
forall k (f :: k -> *) (g :: k -> *) (p :: k). g p -> (:+:) f g p
R1 (b a -> (:+:) a b a) -> Parser (b a) -> Parser ((:+:) a b a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (String :* (Options :* FromArgs arity a)) -> Value -> Parser (b a)
forall arity (f :: * -> *) a.
FromUntaggedValue arity f =>
(String :* (Options :* FromArgs arity a)) -> Value -> Parser (f a)
parseUntaggedValue String :* (Options :* FromArgs arity a)
p Value
value
instance OVERLAPPABLE_
( ConsFromJSON arity a
, Constructor c
) => FromUntaggedValue arity (C1 c a)
where
parseUntaggedValue :: (String :* (Options :* FromArgs arity a))
-> Value -> Parser (C1 c a a)
parseUntaggedValue String :* (Options :* FromArgs arity a)
p = (a a -> C1 c a a) -> Parser (a a) -> Parser (C1 c a a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap a a -> C1 c a a
forall k i (c :: Meta) (f :: k -> *) (p :: k). f p -> M1 i c f p
M1 (Parser (a a) -> Parser (C1 c a a))
-> (Value -> Parser (a a)) -> Value -> Parser (C1 c a a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (String :* (String :* (Options :* FromArgs arity a)))
-> Value -> Parser (a a)
forall arity (f :: * -> *) a.
ConsFromJSON arity f =>
(String :* (String :* (Options :* FromArgs arity a)))
-> Value -> Parser (f a)
consParseJSON (String
cname String
-> (String :* (Options :* FromArgs arity a))
-> String :* (String :* (Options :* FromArgs arity a))
forall a b. a -> b -> a :* b
:* String :* (Options :* FromArgs arity a)
p)
where
cname :: String
cname = M1 Any c Any Any -> String
forall k (c :: k) k1 (t :: k -> (k1 -> *) -> k1 -> *)
(f :: k1 -> *) (a :: k1).
Constructor c =>
t c f a -> String
conName (forall k _i (_f :: k -> *) (_p :: k). M1 _i c _f _p
forall a. HasCallStack => a
undefined :: M1 _i c _f _p)
instance OVERLAPPING_
( Constructor c )
=> FromUntaggedValue arity (C1 c U1)
where
parseUntaggedValue :: (String :* (Options :* FromArgs arity a))
-> Value -> Parser (C1 c U1 a)
parseUntaggedValue (String
tname :* Options
opts :* FromArgs arity a
_) Value
v =
String -> String -> Parser (C1 c U1 a) -> Parser (C1 c U1 a)
forall a. String -> String -> Parser a -> Parser a
contextCons String
cname String
tname (Parser (C1 c U1 a) -> Parser (C1 c U1 a))
-> Parser (C1 c U1 a) -> Parser (C1 c U1 a)
forall a b. (a -> b) -> a -> b
$ case Value
v of
String Text
tag
| Text
tag Text -> Text -> Bool
forall a. Eq a => a -> a -> Bool
== Text
tag' -> C1 c U1 a -> Parser (C1 c U1 a)
forall (f :: * -> *) a. Applicative f => a -> f a
pure (C1 c U1 a -> Parser (C1 c U1 a))
-> C1 c U1 a -> Parser (C1 c U1 a)
forall a b. (a -> b) -> a -> b
$ U1 a -> C1 c U1 a
forall k i (c :: Meta) (f :: k -> *) (p :: k). f p -> M1 i c f p
M1 U1 a
forall k (p :: k). U1 p
U1
| Bool
otherwise -> Text -> Parser (C1 c U1 a)
fail_ Text
tag
Value
_ -> String -> Value -> Parser (C1 c U1 a)
forall a. String -> Value -> Parser a
typeMismatch String
"String" Value
v
where
tag' :: Text
tag' = String -> Text
pack (String -> Text) -> String -> Text
forall a b. (a -> b) -> a -> b
$ Options -> String -> String
constructorTagModifier Options
opts String
cname
cname :: String
cname = M1 Any c Any Any -> String
forall k (c :: k) k1 (t :: k -> (k1 -> *) -> k1 -> *)
(f :: k1 -> *) (a :: k1).
Constructor c =>
t c f a -> String
conName (forall k _i (_f :: k -> *) (_p :: k). M1 _i c _f _p
forall a. HasCallStack => a
undefined :: M1 _i c _f _p)
fail_ :: Text -> Parser (C1 c U1 a)
fail_ Text
tag = String -> Parser (C1 c U1 a)
forall (m :: * -> *) a. MonadFail m => String -> m a
fail (String -> Parser (C1 c U1 a)) -> String -> Parser (C1 c U1 a)
forall a b. (a -> b) -> a -> b
$
String
"expected tag " String -> String -> String
forall a. [a] -> [a] -> [a]
++ Text -> String
forall a. Show a => a -> String
show Text
tag' String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
", but found tag " String -> String -> String
forall a. [a] -> [a] -> [a]
++ Text -> String
forall a. Show a => a -> String
show Text
tag
instance FromJSON2 Const where
liftParseJSON2 :: (Value -> Parser a)
-> (Value -> Parser [a])
-> (Value -> Parser b)
-> (Value -> Parser [b])
-> Value
-> Parser (Const a b)
liftParseJSON2 Value -> Parser a
p Value -> Parser [a]
_ Value -> Parser b
_ Value -> Parser [b]
_ = (a -> Const a b) -> Parser a -> Parser (Const a b)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap a -> Const a b
forall k a (b :: k). a -> Const a b
Const (Parser a -> Parser (Const a b))
-> (Value -> Parser a) -> Value -> Parser (Const a b)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Value -> Parser a
p
{-# INLINE liftParseJSON2 #-}
instance FromJSON a => FromJSON1 (Const a) where
liftParseJSON :: (Value -> Parser a)
-> (Value -> Parser [a]) -> Value -> Parser (Const a a)
liftParseJSON Value -> Parser a
_ Value -> Parser [a]
_ = (a -> Const a a) -> Parser a -> Parser (Const a a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap a -> Const a a
forall k a (b :: k). a -> Const a b
Const (Parser a -> Parser (Const a a))
-> (Value -> Parser a) -> Value -> Parser (Const a a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Value -> Parser a
forall a. FromJSON a => Value -> Parser a
parseJSON
{-# INLINE liftParseJSON #-}
instance FromJSON a => FromJSON (Const a b) where
{-# INLINE parseJSON #-}
parseJSON :: Value -> Parser (Const a b)
parseJSON = (a -> Const a b) -> Parser a -> Parser (Const a b)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap a -> Const a b
forall k a (b :: k). a -> Const a b
Const (Parser a -> Parser (Const a b))
-> (Value -> Parser a) -> Value -> Parser (Const a b)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Value -> Parser a
forall a. FromJSON a => Value -> Parser a
parseJSON
instance (FromJSON a, FromJSONKey a) => FromJSONKey (Const a b) where
fromJSONKey :: FromJSONKeyFunction (Const a b)
fromJSONKey = (a -> Const a b)
-> FromJSONKeyFunction a -> FromJSONKeyFunction (Const a b)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap a -> Const a b
forall k a (b :: k). a -> Const a b
Const FromJSONKeyFunction a
forall a. FromJSONKey a => FromJSONKeyFunction a
fromJSONKey
instance FromJSON1 Maybe where
liftParseJSON :: (Value -> Parser a)
-> (Value -> Parser [a]) -> Value -> Parser (Maybe a)
liftParseJSON Value -> Parser a
_ Value -> Parser [a]
_ Value
Null = Maybe a -> Parser (Maybe a)
forall (f :: * -> *) a. Applicative f => a -> f a
pure Maybe a
forall a. Maybe a
Nothing
liftParseJSON Value -> Parser a
p Value -> Parser [a]
_ Value
a = a -> Maybe a
forall a. a -> Maybe a
Just (a -> Maybe a) -> Parser a -> Parser (Maybe a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Value -> Parser a
p Value
a
{-# INLINE liftParseJSON #-}
instance (FromJSON a) => FromJSON (Maybe a) where
parseJSON :: Value -> Parser (Maybe a)
parseJSON = Value -> Parser (Maybe a)
forall (f :: * -> *) a.
(FromJSON1 f, FromJSON a) =>
Value -> Parser (f a)
parseJSON1
{-# INLINE parseJSON #-}
instance FromJSON2 Either where
liftParseJSON2 :: (Value -> Parser a)
-> (Value -> Parser [a])
-> (Value -> Parser b)
-> (Value -> Parser [b])
-> Value
-> Parser (Either a b)
liftParseJSON2 Value -> Parser a
pA Value -> Parser [a]
_ Value -> Parser b
pB Value -> Parser [b]
_ (Object (Object -> [(Text, Value)]
forall k v. HashMap k v -> [(k, v)]
H.toList -> [(Text
key, Value
value)]))
| Text
key Text -> Text -> Bool
forall a. Eq a => a -> a -> Bool
== Text
left = a -> Either a b
forall a b. a -> Either a b
Left (a -> Either a b) -> Parser a -> Parser (Either a b)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Value -> Parser a
pA Value
value Parser a -> JSONPathElement -> Parser a
forall a. Parser a -> JSONPathElement -> Parser a
<?> Text -> JSONPathElement
Key Text
left
| Text
key Text -> Text -> Bool
forall a. Eq a => a -> a -> Bool
== Text
right = b -> Either a b
forall a b. b -> Either a b
Right (b -> Either a b) -> Parser b -> Parser (Either a b)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Value -> Parser b
pB Value
value Parser b -> JSONPathElement -> Parser b
forall a. Parser a -> JSONPathElement -> Parser a
<?> Text -> JSONPathElement
Key Text
right
where
left, right :: Text
left :: Text
left = Text
"Left"
right :: Text
right = Text
"Right"
liftParseJSON2 Value -> Parser a
_ Value -> Parser [a]
_ Value -> Parser b
_ Value -> Parser [b]
_ Value
_ = String -> Parser (Either a b)
forall (m :: * -> *) a. MonadFail m => String -> m a
fail (String -> Parser (Either a b)) -> String -> Parser (Either a b)
forall a b. (a -> b) -> a -> b
$
String
"expected an object with a single property " String -> String -> String
forall a. [a] -> [a] -> [a]
++
String
"where the property key should be either " String -> String -> String
forall a. [a] -> [a] -> [a]
++
String
"\"Left\" or \"Right\""
{-# INLINE liftParseJSON2 #-}
instance (FromJSON a) => FromJSON1 (Either a) where
liftParseJSON :: (Value -> Parser a)
-> (Value -> Parser [a]) -> Value -> Parser (Either a a)
liftParseJSON = (Value -> Parser a)
-> (Value -> Parser [a])
-> (Value -> Parser a)
-> (Value -> Parser [a])
-> Value
-> Parser (Either a a)
forall (f :: * -> * -> *) a b.
FromJSON2 f =>
(Value -> Parser a)
-> (Value -> Parser [a])
-> (Value -> Parser b)
-> (Value -> Parser [b])
-> Value
-> Parser (f a b)
liftParseJSON2 Value -> Parser a
forall a. FromJSON a => Value -> Parser a
parseJSON Value -> Parser [a]
forall a. FromJSON a => Value -> Parser [a]
parseJSONList
{-# INLINE liftParseJSON #-}
instance (FromJSON a, FromJSON b) => FromJSON (Either a b) where
parseJSON :: Value -> Parser (Either a b)
parseJSON = Value -> Parser (Either a b)
forall (f :: * -> * -> *) a b.
(FromJSON2 f, FromJSON a, FromJSON b) =>
Value -> Parser (f a b)
parseJSON2
{-# INLINE parseJSON #-}
instance FromJSON Void where
parseJSON :: Value -> Parser Void
parseJSON Value
_ = String -> Parser Void
forall (m :: * -> *) a. MonadFail m => String -> m a
fail String
"Cannot parse Void"
{-# INLINE parseJSON #-}
instance FromJSON Bool where
parseJSON :: Value -> Parser Bool
parseJSON (Bool Bool
b) = Bool -> Parser Bool
forall (f :: * -> *) a. Applicative f => a -> f a
pure Bool
b
parseJSON Value
v = String -> Value -> Parser Bool
forall a. String -> Value -> Parser a
typeMismatch String
"Bool" Value
v
{-# INLINE parseJSON #-}
instance FromJSONKey Bool where
fromJSONKey :: FromJSONKeyFunction Bool
fromJSONKey = (Text -> Parser Bool) -> FromJSONKeyFunction Bool
forall a. (Text -> Parser a) -> FromJSONKeyFunction a
FromJSONKeyTextParser ((Text -> Parser Bool) -> FromJSONKeyFunction Bool)
-> (Text -> Parser Bool) -> FromJSONKeyFunction Bool
forall a b. (a -> b) -> a -> b
$ \Text
t -> case Text
t of
Text
"true" -> Bool -> Parser Bool
forall (f :: * -> *) a. Applicative f => a -> f a
pure Bool
True
Text
"false" -> Bool -> Parser Bool
forall (f :: * -> *) a. Applicative f => a -> f a
pure Bool
False
Text
_ -> String -> Parser Bool
forall (m :: * -> *) a. MonadFail m => String -> m a
fail (String -> Parser Bool) -> String -> Parser Bool
forall a b. (a -> b) -> a -> b
$ String
"cannot parse key " String -> String -> String
forall a. [a] -> [a] -> [a]
++ Text -> String
forall a. Show a => a -> String
show Text
t String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
" into Bool"
instance FromJSON Ordering where
parseJSON :: Value -> Parser Ordering
parseJSON = String -> (Text -> Parser Ordering) -> Value -> Parser Ordering
forall a. String -> (Text -> Parser a) -> Value -> Parser a
withText String
"Ordering" ((Text -> Parser Ordering) -> Value -> Parser Ordering)
-> (Text -> Parser Ordering) -> Value -> Parser Ordering
forall a b. (a -> b) -> a -> b
$ \Text
s ->
case Text
s of
Text
"LT" -> Ordering -> Parser Ordering
forall (m :: * -> *) a. Monad m => a -> m a
return Ordering
LT
Text
"EQ" -> Ordering -> Parser Ordering
forall (m :: * -> *) a. Monad m => a -> m a
return Ordering
EQ
Text
"GT" -> Ordering -> Parser Ordering
forall (m :: * -> *) a. Monad m => a -> m a
return Ordering
GT
Text
_ -> String -> Parser Ordering
forall (m :: * -> *) a. MonadFail m => String -> m a
fail (String -> Parser Ordering) -> String -> Parser Ordering
forall a b. (a -> b) -> a -> b
$ String
"parsing Ordering failed, unexpected " String -> String -> String
forall a. [a] -> [a] -> [a]
++ Text -> String
forall a. Show a => a -> String
show Text
s String -> String -> String
forall a. [a] -> [a] -> [a]
++
String
" (expected \"LT\", \"EQ\", or \"GT\")"
instance FromJSON () where
parseJSON :: Value -> Parser ()
parseJSON = String -> (Array -> Parser ()) -> Value -> Parser ()
forall a. String -> (Array -> Parser a) -> Value -> Parser a
withArray String
"()" ((Array -> Parser ()) -> Value -> Parser ())
-> (Array -> Parser ()) -> Value -> Parser ()
forall a b. (a -> b) -> a -> b
$ \Array
v ->
if Array -> Bool
forall a. Vector a -> Bool
V.null Array
v
then () -> Parser ()
forall (f :: * -> *) a. Applicative f => a -> f a
pure ()
else String -> Parser () -> Parser ()
forall a. String -> Parser a -> Parser a
prependContext String
"()" (Parser () -> Parser ()) -> Parser () -> Parser ()
forall a b. (a -> b) -> a -> b
$ String -> Parser ()
forall (m :: * -> *) a. MonadFail m => String -> m a
fail String
"expected an empty array"
{-# INLINE parseJSON #-}
instance FromJSON Char where
parseJSON :: Value -> Parser Char
parseJSON = String -> (Text -> Parser Char) -> Value -> Parser Char
forall a. String -> (Text -> Parser a) -> Value -> Parser a
withText String
"Char" Text -> Parser Char
parseChar
{-# INLINE parseJSON #-}
parseJSONList :: Value -> Parser String
parseJSONList (String Text
s) = String -> Parser String
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Text -> String
T.unpack Text
s)
parseJSONList Value
v = String -> Value -> Parser String
forall a. String -> Value -> Parser a
typeMismatch String
"String" Value
v
{-# INLINE parseJSONList #-}
parseChar :: Text -> Parser Char
parseChar :: Text -> Parser Char
parseChar Text
t =
if Text -> Int -> Ordering
T.compareLength Text
t Int
1 Ordering -> Ordering -> Bool
forall a. Eq a => a -> a -> Bool
== Ordering
EQ
then Char -> Parser Char
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Char -> Parser Char) -> Char -> Parser Char
forall a b. (a -> b) -> a -> b
$ Text -> Char
T.head Text
t
else String -> Parser Char -> Parser Char
forall a. String -> Parser a -> Parser a
prependContext String
"Char" (Parser Char -> Parser Char) -> Parser Char -> Parser Char
forall a b. (a -> b) -> a -> b
$ String -> Parser Char
forall (m :: * -> *) a. MonadFail m => String -> m a
fail String
"expected a string of length 1"
instance FromJSON Double where
parseJSON :: Value -> Parser Double
parseJSON = String -> Value -> Parser Double
forall a. RealFloat a => String -> Value -> Parser a
parseRealFloat String
"Double"
{-# INLINE parseJSON #-}
instance FromJSONKey Double where
fromJSONKey :: FromJSONKeyFunction Double
fromJSONKey = (Text -> Parser Double) -> FromJSONKeyFunction Double
forall a. (Text -> Parser a) -> FromJSONKeyFunction a
FromJSONKeyTextParser ((Text -> Parser Double) -> FromJSONKeyFunction Double)
-> (Text -> Parser Double) -> FromJSONKeyFunction Double
forall a b. (a -> b) -> a -> b
$ \Text
t -> case Text
t of
Text
"NaN" -> Double -> Parser Double
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Double
0Double -> Double -> Double
forall a. Fractional a => a -> a -> a
/Double
0)
Text
"Infinity" -> Double -> Parser Double
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Double
1Double -> Double -> Double
forall a. Fractional a => a -> a -> a
/Double
0)
Text
"-Infinity" -> Double -> Parser Double
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Double -> Double
forall a. Num a => a -> a
negate Double
1Double -> Double -> Double
forall a. Fractional a => a -> a -> a
/Double
0)
Text
_ -> Scientific -> Double
forall a. RealFloat a => Scientific -> a
Scientific.toRealFloat (Scientific -> Double) -> Parser Scientific -> Parser Double
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Text -> Parser Scientific
parseScientificText Text
t
instance FromJSON Float where
parseJSON :: Value -> Parser Float
parseJSON = String -> Value -> Parser Float
forall a. RealFloat a => String -> Value -> Parser a
parseRealFloat String
"Float"
{-# INLINE parseJSON #-}
instance FromJSONKey Float where
fromJSONKey :: FromJSONKeyFunction Float
fromJSONKey = (Text -> Parser Float) -> FromJSONKeyFunction Float
forall a. (Text -> Parser a) -> FromJSONKeyFunction a
FromJSONKeyTextParser ((Text -> Parser Float) -> FromJSONKeyFunction Float)
-> (Text -> Parser Float) -> FromJSONKeyFunction Float
forall a b. (a -> b) -> a -> b
$ \Text
t -> case Text
t of
Text
"NaN" -> Float -> Parser Float
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Float
0Float -> Float -> Float
forall a. Fractional a => a -> a -> a
/Float
0)
Text
"Infinity" -> Float -> Parser Float
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Float
1Float -> Float -> Float
forall a. Fractional a => a -> a -> a
/Float
0)
Text
"-Infinity" -> Float -> Parser Float
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Float -> Float
forall a. Num a => a -> a
negate Float
1Float -> Float -> Float
forall a. Fractional a => a -> a -> a
/Float
0)
Text
_ -> Scientific -> Float
forall a. RealFloat a => Scientific -> a
Scientific.toRealFloat (Scientific -> Float) -> Parser Scientific -> Parser Float
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Text -> Parser Scientific
parseScientificText Text
t
instance (FromJSON a, Integral a) => FromJSON (Ratio a) where
parseJSON :: Value -> Parser (Ratio a)
parseJSON (Number Scientific
x)
| Int
exp10 Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<= Int
1024
, Int
exp10 Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
>= -Int
1024 = Ratio a -> Parser (Ratio a)
forall (m :: * -> *) a. Monad m => a -> m a
return (Ratio a -> Parser (Ratio a)) -> Ratio a -> Parser (Ratio a)
forall a b. (a -> b) -> a -> b
$! Scientific -> Ratio a
forall a b. (Real a, Fractional b) => a -> b
realToFrac Scientific
x
| Bool
otherwise = String -> Parser (Ratio a) -> Parser (Ratio a)
forall a. String -> Parser a -> Parser a
prependContext String
"Ratio" (Parser (Ratio a) -> Parser (Ratio a))
-> Parser (Ratio a) -> Parser (Ratio a)
forall a b. (a -> b) -> a -> b
$ String -> Parser (Ratio a)
forall (m :: * -> *) a. MonadFail m => String -> m a
fail String
msg
where
exp10 :: Int
exp10 = Scientific -> Int
base10Exponent Scientific
x
msg :: String
msg = String
"found a number with exponent " String -> String -> String
forall a. [a] -> [a] -> [a]
++ Int -> String
forall a. Show a => a -> String
show Int
exp10
String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
", but it must not be greater than 1024 or less than -1024"
parseJSON Value
o = Value -> Parser (Ratio a)
objParser Value
o
where
objParser :: Value -> Parser (Ratio a)
objParser = String -> (Object -> Parser (Ratio a)) -> Value -> Parser (Ratio a)
forall a. String -> (Object -> Parser a) -> Value -> Parser a
withObject String
"Rational" ((Object -> Parser (Ratio a)) -> Value -> Parser (Ratio a))
-> (Object -> Parser (Ratio a)) -> Value -> Parser (Ratio a)
forall a b. (a -> b) -> a -> b
$ \Object
obj -> do
a
numerator <- Object
obj Object -> Text -> Parser a
forall a. FromJSON a => Object -> Text -> Parser a
.: Text
"numerator"
a
denominator <- Object
obj Object -> Text -> Parser a
forall a. FromJSON a => Object -> Text -> Parser a
.: Text
"denominator"
if a
denominator a -> a -> Bool
forall a. Eq a => a -> a -> Bool
== a
0
then String -> Parser (Ratio a)
forall (m :: * -> *) a. MonadFail m => String -> m a
fail String
"Ratio denominator was 0"
else Ratio a -> Parser (Ratio a)
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Ratio a -> Parser (Ratio a)) -> Ratio a -> Parser (Ratio a)
forall a b. (a -> b) -> a -> b
$ a
numerator a -> a -> Ratio a
forall a. Integral a => a -> a -> Ratio a
% a
denominator
{-# INLINE parseJSON #-}
instance HasResolution a => FromJSON (Fixed a) where
parseJSON :: Value -> Parser (Fixed a)
parseJSON = String -> Parser (Fixed a) -> Parser (Fixed a)
forall a. String -> Parser a -> Parser a
prependContext String
"Fixed" (Parser (Fixed a) -> Parser (Fixed a))
-> (Value -> Parser (Fixed a)) -> Value -> Parser (Fixed a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Scientific -> Parser (Fixed a)) -> Value -> Parser (Fixed a)
forall a. (Scientific -> Parser a) -> Value -> Parser a
withBoundedScientific' (Fixed a -> Parser (Fixed a)
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Fixed a -> Parser (Fixed a))
-> (Scientific -> Fixed a) -> Scientific -> Parser (Fixed a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Scientific -> Fixed a
forall a b. (Real a, Fractional b) => a -> b
realToFrac)
{-# INLINE parseJSON #-}
instance FromJSON Int where
parseJSON :: Value -> Parser Int
parseJSON = String -> Value -> Parser Int
forall a. (Bounded a, Integral a) => String -> Value -> Parser a
parseBoundedIntegral String
"Int"
{-# INLINE parseJSON #-}
instance FromJSONKey Int where
fromJSONKey :: FromJSONKeyFunction Int
fromJSONKey = (Text -> Parser Int) -> FromJSONKeyFunction Int
forall a. (Text -> Parser a) -> FromJSONKeyFunction a
FromJSONKeyTextParser ((Text -> Parser Int) -> FromJSONKeyFunction Int)
-> (Text -> Parser Int) -> FromJSONKeyFunction Int
forall a b. (a -> b) -> a -> b
$ String -> Text -> Parser Int
forall a. (Bounded a, Integral a) => String -> Text -> Parser a
parseBoundedIntegralText String
"Int"
instance FromJSON Integer where
parseJSON :: Value -> Parser Integer
parseJSON = String -> Value -> Parser Integer
forall a. Integral a => String -> Value -> Parser a
parseIntegral String
"Integer"
{-# INLINE parseJSON #-}
instance FromJSONKey Integer where
fromJSONKey :: FromJSONKeyFunction Integer
fromJSONKey = (Text -> Parser Integer) -> FromJSONKeyFunction Integer
forall a. (Text -> Parser a) -> FromJSONKeyFunction a
FromJSONKeyTextParser ((Text -> Parser Integer) -> FromJSONKeyFunction Integer)
-> (Text -> Parser Integer) -> FromJSONKeyFunction Integer
forall a b. (a -> b) -> a -> b
$ String -> Text -> Parser Integer
forall a. Integral a => String -> Text -> Parser a
parseIntegralText String
"Integer"
instance FromJSON Natural where
parseJSON :: Value -> Parser Natural
parseJSON Value
value = do
Integer
integer <- String -> Value -> Parser Integer
forall a. Integral a => String -> Value -> Parser a
parseIntegral String
"Natural" Value
value
Integer -> Parser Natural
parseNatural Integer
integer
instance FromJSONKey Natural where
fromJSONKey :: FromJSONKeyFunction Natural
fromJSONKey = (Text -> Parser Natural) -> FromJSONKeyFunction Natural
forall a. (Text -> Parser a) -> FromJSONKeyFunction a
FromJSONKeyTextParser ((Text -> Parser Natural) -> FromJSONKeyFunction Natural)
-> (Text -> Parser Natural) -> FromJSONKeyFunction Natural
forall a b. (a -> b) -> a -> b
$ \Text
text -> do
Integer
integer <- String -> Text -> Parser Integer
forall a. Integral a => String -> Text -> Parser a
parseIntegralText String
"Natural" Text
text
Integer -> Parser Natural
parseNatural Integer
integer
parseNatural :: Integer -> Parser Natural
parseNatural :: Integer -> Parser Natural
parseNatural Integer
integer =
if Integer
integer Integer -> Integer -> Bool
forall a. Ord a => a -> a -> Bool
< Integer
0 then
String -> Parser Natural
forall (m :: * -> *) a. MonadFail m => String -> m a
fail (String -> Parser Natural) -> String -> Parser Natural
forall a b. (a -> b) -> a -> b
$ String
"parsing Natural failed, unexpected negative number " String -> String -> String
forall a. Semigroup a => a -> a -> a
<> Integer -> String
forall a. Show a => a -> String
show Integer
integer
else
Natural -> Parser Natural
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Natural -> Parser Natural) -> Natural -> Parser Natural
forall a b. (a -> b) -> a -> b
$ Integer -> Natural
forall a b. (Integral a, Num b) => a -> b
fromIntegral Integer
integer
instance FromJSON Int8 where
parseJSON :: Value -> Parser Int8
parseJSON = String -> Value -> Parser Int8
forall a. (Bounded a, Integral a) => String -> Value -> Parser a
parseBoundedIntegral String
"Int8"
{-# INLINE parseJSON #-}
instance FromJSONKey Int8 where
fromJSONKey :: FromJSONKeyFunction Int8
fromJSONKey = (Text -> Parser Int8) -> FromJSONKeyFunction Int8
forall a. (Text -> Parser a) -> FromJSONKeyFunction a
FromJSONKeyTextParser ((Text -> Parser Int8) -> FromJSONKeyFunction Int8)
-> (Text -> Parser Int8) -> FromJSONKeyFunction Int8
forall a b. (a -> b) -> a -> b
$ String -> Text -> Parser Int8
forall a. (Bounded a, Integral a) => String -> Text -> Parser a
parseBoundedIntegralText String
"Int8"
instance FromJSON Int16 where
parseJSON :: Value -> Parser Int16
parseJSON = String -> Value -> Parser Int16
forall a. (Bounded a, Integral a) => String -> Value -> Parser a
parseBoundedIntegral String
"Int16"
{-# INLINE parseJSON #-}
instance FromJSONKey Int16 where
fromJSONKey :: FromJSONKeyFunction Int16
fromJSONKey = (Text -> Parser Int16) -> FromJSONKeyFunction Int16
forall a. (Text -> Parser a) -> FromJSONKeyFunction a
FromJSONKeyTextParser ((Text -> Parser Int16) -> FromJSONKeyFunction Int16)
-> (Text -> Parser Int16) -> FromJSONKeyFunction Int16
forall a b. (a -> b) -> a -> b
$ String -> Text -> Parser Int16
forall a. (Bounded a, Integral a) => String -> Text -> Parser a
parseBoundedIntegralText String
"Int16"
instance FromJSON Int32 where
parseJSON :: Value -> Parser Int32
parseJSON = String -> Value -> Parser Int32
forall a. (Bounded a, Integral a) => String -> Value -> Parser a
parseBoundedIntegral String
"Int32"
{-# INLINE parseJSON #-}
instance FromJSONKey Int32 where
fromJSONKey :: FromJSONKeyFunction Int32
fromJSONKey = (Text -> Parser Int32) -> FromJSONKeyFunction Int32
forall a. (Text -> Parser a) -> FromJSONKeyFunction a
FromJSONKeyTextParser ((Text -> Parser Int32) -> FromJSONKeyFunction Int32)
-> (Text -> Parser Int32) -> FromJSONKeyFunction Int32
forall a b. (a -> b) -> a -> b
$ String -> Text -> Parser Int32
forall a. (Bounded a, Integral a) => String -> Text -> Parser a
parseBoundedIntegralText String
"Int32"
instance FromJSON Int64 where
parseJSON :: Value -> Parser Int64
parseJSON = String -> Value -> Parser Int64
forall a. (Bounded a, Integral a) => String -> Value -> Parser a
parseBoundedIntegral String
"Int64"
{-# INLINE parseJSON #-}
instance FromJSONKey Int64 where
fromJSONKey :: FromJSONKeyFunction Int64
fromJSONKey = (Text -> Parser Int64) -> FromJSONKeyFunction Int64
forall a. (Text -> Parser a) -> FromJSONKeyFunction a
FromJSONKeyTextParser ((Text -> Parser Int64) -> FromJSONKeyFunction Int64)
-> (Text -> Parser Int64) -> FromJSONKeyFunction Int64
forall a b. (a -> b) -> a -> b
$ String -> Text -> Parser Int64
forall a. (Bounded a, Integral a) => String -> Text -> Parser a
parseBoundedIntegralText String
"Int64"
instance FromJSON Word where
parseJSON :: Value -> Parser Word
parseJSON = String -> Value -> Parser Word
forall a. (Bounded a, Integral a) => String -> Value -> Parser a
parseBoundedIntegral String
"Word"
{-# INLINE parseJSON #-}
instance FromJSONKey Word where
fromJSONKey :: FromJSONKeyFunction Word
fromJSONKey = (Text -> Parser Word) -> FromJSONKeyFunction Word
forall a. (Text -> Parser a) -> FromJSONKeyFunction a
FromJSONKeyTextParser ((Text -> Parser Word) -> FromJSONKeyFunction Word)
-> (Text -> Parser Word) -> FromJSONKeyFunction Word
forall a b. (a -> b) -> a -> b
$ String -> Text -> Parser Word
forall a. (Bounded a, Integral a) => String -> Text -> Parser a
parseBoundedIntegralText String
"Word"
instance FromJSON Word8 where
parseJSON :: Value -> Parser Word8
parseJSON = String -> Value -> Parser Word8
forall a. (Bounded a, Integral a) => String -> Value -> Parser a
parseBoundedIntegral String
"Word8"
{-# INLINE parseJSON #-}
instance FromJSONKey Word8 where
fromJSONKey :: FromJSONKeyFunction Word8
fromJSONKey = (Text -> Parser Word8) -> FromJSONKeyFunction Word8
forall a. (Text -> Parser a) -> FromJSONKeyFunction a
FromJSONKeyTextParser ((Text -> Parser Word8) -> FromJSONKeyFunction Word8)
-> (Text -> Parser Word8) -> FromJSONKeyFunction Word8
forall a b. (a -> b) -> a -> b
$ String -> Text -> Parser Word8
forall a. (Bounded a, Integral a) => String -> Text -> Parser a
parseBoundedIntegralText String
"Word8"
instance FromJSON Word16 where
parseJSON :: Value -> Parser Word16
parseJSON = String -> Value -> Parser Word16
forall a. (Bounded a, Integral a) => String -> Value -> Parser a
parseBoundedIntegral String
"Word16"
{-# INLINE parseJSON #-}
instance FromJSONKey Word16 where
fromJSONKey :: FromJSONKeyFunction Word16
fromJSONKey = (Text -> Parser Word16) -> FromJSONKeyFunction Word16
forall a. (Text -> Parser a) -> FromJSONKeyFunction a
FromJSONKeyTextParser ((Text -> Parser Word16) -> FromJSONKeyFunction Word16)
-> (Text -> Parser Word16) -> FromJSONKeyFunction Word16
forall a b. (a -> b) -> a -> b
$ String -> Text -> Parser Word16
forall a. (Bounded a, Integral a) => String -> Text -> Parser a
parseBoundedIntegralText String
"Word16"
instance FromJSON Word32 where
parseJSON :: Value -> Parser Word32
parseJSON = String -> Value -> Parser Word32
forall a. (Bounded a, Integral a) => String -> Value -> Parser a
parseBoundedIntegral String
"Word32"
{-# INLINE parseJSON #-}
instance FromJSONKey Word32 where
fromJSONKey :: FromJSONKeyFunction Word32
fromJSONKey = (Text -> Parser Word32) -> FromJSONKeyFunction Word32
forall a. (Text -> Parser a) -> FromJSONKeyFunction a
FromJSONKeyTextParser ((Text -> Parser Word32) -> FromJSONKeyFunction Word32)
-> (Text -> Parser Word32) -> FromJSONKeyFunction Word32
forall a b. (a -> b) -> a -> b
$ String -> Text -> Parser Word32
forall a. (Bounded a, Integral a) => String -> Text -> Parser a
parseBoundedIntegralText String
"Word32"
instance FromJSON Word64 where
parseJSON :: Value -> Parser Word64
parseJSON = String -> Value -> Parser Word64
forall a. (Bounded a, Integral a) => String -> Value -> Parser a
parseBoundedIntegral String
"Word64"
{-# INLINE parseJSON #-}
instance FromJSONKey Word64 where
fromJSONKey :: FromJSONKeyFunction Word64
fromJSONKey = (Text -> Parser Word64) -> FromJSONKeyFunction Word64
forall a. (Text -> Parser a) -> FromJSONKeyFunction a
FromJSONKeyTextParser ((Text -> Parser Word64) -> FromJSONKeyFunction Word64)
-> (Text -> Parser Word64) -> FromJSONKeyFunction Word64
forall a b. (a -> b) -> a -> b
$ String -> Text -> Parser Word64
forall a. (Bounded a, Integral a) => String -> Text -> Parser a
parseBoundedIntegralText String
"Word64"
instance FromJSON CTime where
parseJSON :: Value -> Parser CTime
parseJSON = (Int64 -> CTime) -> Parser Int64 -> Parser CTime
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Int64 -> CTime
CTime (Parser Int64 -> Parser CTime)
-> (Value -> Parser Int64) -> Value -> Parser CTime
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Value -> Parser Int64
forall a. FromJSON a => Value -> Parser a
parseJSON
{-# INLINE parseJSON #-}
instance FromJSON Text where
parseJSON :: Value -> Parser Text
parseJSON = String -> (Text -> Parser Text) -> Value -> Parser Text
forall a. String -> (Text -> Parser a) -> Value -> Parser a
withText String
"Text" Text -> Parser Text
forall (f :: * -> *) a. Applicative f => a -> f a
pure
{-# INLINE parseJSON #-}
instance FromJSONKey Text where
fromJSONKey :: FromJSONKeyFunction Text
fromJSONKey = FromJSONKeyFunction Text
forall a. Coercible Text a => FromJSONKeyFunction a
fromJSONKeyCoerce
instance FromJSON LT.Text where
parseJSON :: Value -> Parser Text
parseJSON = String -> (Text -> Parser Text) -> Value -> Parser Text
forall a. String -> (Text -> Parser a) -> Value -> Parser a
withText String
"Lazy Text" ((Text -> Parser Text) -> Value -> Parser Text)
-> (Text -> Parser Text) -> Value -> Parser Text
forall a b. (a -> b) -> a -> b
$ Text -> Parser Text
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Text -> Parser Text) -> (Text -> Text) -> Text -> Parser Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> Text
LT.fromStrict
{-# INLINE parseJSON #-}
instance FromJSONKey LT.Text where
fromJSONKey :: FromJSONKeyFunction Text
fromJSONKey = (Text -> Text) -> FromJSONKeyFunction Text
forall a. (Text -> a) -> FromJSONKeyFunction a
FromJSONKeyText Text -> Text
LT.fromStrict
instance FromJSON Version where
parseJSON :: Value -> Parser Version
parseJSON = String -> (Text -> Parser Version) -> Value -> Parser Version
forall a. String -> (Text -> Parser a) -> Value -> Parser a
withText String
"Version" Text -> Parser Version
parseVersionText
{-# INLINE parseJSON #-}
instance FromJSONKey Version where
fromJSONKey :: FromJSONKeyFunction Version
fromJSONKey = (Text -> Parser Version) -> FromJSONKeyFunction Version
forall a. (Text -> Parser a) -> FromJSONKeyFunction a
FromJSONKeyTextParser Text -> Parser Version
parseVersionText
parseVersionText :: Text -> Parser Version
parseVersionText :: Text -> Parser Version
parseVersionText = [(Version, String)] -> Parser Version
forall (m :: * -> *) a a. MonadFail m => [(a, [a])] -> m a
go ([(Version, String)] -> Parser Version)
-> (Text -> [(Version, String)]) -> Text -> Parser Version
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ReadP Version -> ReadS Version
forall a. ReadP a -> ReadS a
readP_to_S ReadP Version
parseVersion ReadS Version -> (Text -> String) -> Text -> [(Version, String)]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> String
unpack
where
go :: [(a, [a])] -> m a
go [(a
v,[])] = a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return a
v
go ((a, [a])
_ : [(a, [a])]
xs) = [(a, [a])] -> m a
go [(a, [a])]
xs
go [(a, [a])]
_ = String -> m a
forall (m :: * -> *) a. MonadFail m => String -> m a
fail String
"parsing Version failed"
instance FromJSON1 NonEmpty where
liftParseJSON :: (Value -> Parser a)
-> (Value -> Parser [a]) -> Value -> Parser (NonEmpty a)
liftParseJSON Value -> Parser a
p Value -> Parser [a]
_ = String
-> (Array -> Parser (NonEmpty a)) -> Value -> Parser (NonEmpty a)
forall a. String -> (Array -> Parser a) -> Value -> Parser a
withArray String
"NonEmpty" ((Array -> Parser (NonEmpty a)) -> Value -> Parser (NonEmpty a))
-> (Array -> Parser (NonEmpty a)) -> Value -> Parser (NonEmpty a)
forall a b. (a -> b) -> a -> b
$
(Parser [a] -> ([a] -> Parser (NonEmpty a)) -> Parser (NonEmpty a)
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= [a] -> Parser (NonEmpty a)
forall (m :: * -> *) a. MonadFail m => [a] -> m (NonEmpty a)
ne) (Parser [a] -> Parser (NonEmpty a))
-> (Array -> Parser [a]) -> Array -> Parser (NonEmpty a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Parser a] -> Parser [a]
forall (t :: * -> *) (m :: * -> *) a.
(Traversable t, Monad m) =>
t (m a) -> m (t a)
Tr.sequence ([Parser a] -> Parser [a])
-> (Array -> [Parser a]) -> Array -> Parser [a]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Int -> Value -> Parser a) -> [Int] -> [Value] -> [Parser a]
forall a b c. (a -> b -> c) -> [a] -> [b] -> [c]
zipWith ((Value -> Parser a) -> Int -> Value -> Parser a
forall a. (Value -> Parser a) -> Int -> Value -> Parser a
parseIndexedJSON Value -> Parser a
p) [Int
0..] ([Value] -> [Parser a])
-> (Array -> [Value]) -> Array -> [Parser a]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Array -> [Value]
forall a. Vector a -> [a]
V.toList
where
ne :: [a] -> m (NonEmpty a)
ne [] = String -> m (NonEmpty a)
forall (m :: * -> *) a. MonadFail m => String -> m a
fail String
"parsing NonEmpty failed, unexpected empty list"
ne (a
x:[a]
xs) = NonEmpty a -> m (NonEmpty a)
forall (f :: * -> *) a. Applicative f => a -> f a
pure (a
x a -> [a] -> NonEmpty a
forall a. a -> [a] -> NonEmpty a
:| [a]
xs)
{-# INLINE liftParseJSON #-}
instance (FromJSON a) => FromJSON (NonEmpty a) where
parseJSON :: Value -> Parser (NonEmpty a)
parseJSON = Value -> Parser (NonEmpty a)
forall (f :: * -> *) a.
(FromJSON1 f, FromJSON a) =>
Value -> Parser (f a)
parseJSON1
{-# INLINE parseJSON #-}
instance FromJSON Scientific where
parseJSON :: Value -> Parser Scientific
parseJSON = String
-> (Scientific -> Parser Scientific) -> Value -> Parser Scientific
forall a. String -> (Scientific -> Parser a) -> Value -> Parser a
withScientific String
"Scientific" Scientific -> Parser Scientific
forall (f :: * -> *) a. Applicative f => a -> f a
pure
{-# INLINE parseJSON #-}
instance FromJSON1 DList.DList where
liftParseJSON :: (Value -> Parser a)
-> (Value -> Parser [a]) -> Value -> Parser (DList a)
liftParseJSON Value -> Parser a
p Value -> Parser [a]
_ = String -> (Array -> Parser (DList a)) -> Value -> Parser (DList a)
forall a. String -> (Array -> Parser a) -> Value -> Parser a
withArray String
"DList" ((Array -> Parser (DList a)) -> Value -> Parser (DList a))
-> (Array -> Parser (DList a)) -> Value -> Parser (DList a)
forall a b. (a -> b) -> a -> b
$
([a] -> DList a) -> Parser [a] -> Parser (DList a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap [a] -> DList a
forall a. [a] -> DList a
DList.fromList (Parser [a] -> Parser (DList a))
-> (Array -> Parser [a]) -> Array -> Parser (DList a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
[Parser a] -> Parser [a]
forall (t :: * -> *) (m :: * -> *) a.
(Traversable t, Monad m) =>
t (m a) -> m (t a)
Tr.sequence ([Parser a] -> Parser [a])
-> (Array -> [Parser a]) -> Array -> Parser [a]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Int -> Value -> Parser a) -> [Int] -> [Value] -> [Parser a]
forall a b c. (a -> b -> c) -> [a] -> [b] -> [c]
zipWith ((Value -> Parser a) -> Int -> Value -> Parser a
forall a. (Value -> Parser a) -> Int -> Value -> Parser a
parseIndexedJSON Value -> Parser a
p) [Int
0..] ([Value] -> [Parser a])
-> (Array -> [Value]) -> Array -> [Parser a]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Array -> [Value]
forall a. Vector a -> [a]
V.toList
{-# INLINE liftParseJSON #-}
instance (FromJSON a) => FromJSON (DList.DList a) where
parseJSON :: Value -> Parser (DList a)
parseJSON = Value -> Parser (DList a)
forall (f :: * -> *) a.
(FromJSON1 f, FromJSON a) =>
Value -> Parser (f a)
parseJSON1
{-# INLINE parseJSON #-}
#if MIN_VERSION_dlist(1,0,0) && __GLASGOW_HASKELL__ >=800
instance FromJSON1 DNE.DNonEmpty where
liftParseJSON :: (Value -> Parser a)
-> (Value -> Parser [a]) -> Value -> Parser (DNonEmpty a)
liftParseJSON Value -> Parser a
p Value -> Parser [a]
_ = String
-> (Array -> Parser (DNonEmpty a)) -> Value -> Parser (DNonEmpty a)
forall a. String -> (Array -> Parser a) -> Value -> Parser a
withArray String
"DNonEmpty" ((Array -> Parser (DNonEmpty a)) -> Value -> Parser (DNonEmpty a))
-> (Array -> Parser (DNonEmpty a)) -> Value -> Parser (DNonEmpty a)
forall a b. (a -> b) -> a -> b
$
(Parser [a] -> ([a] -> Parser (DNonEmpty a)) -> Parser (DNonEmpty a)
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= [a] -> Parser (DNonEmpty a)
forall (m :: * -> *) a. MonadFail m => [a] -> m (DNonEmpty a)
ne) (Parser [a] -> Parser (DNonEmpty a))
-> (Array -> Parser [a]) -> Array -> Parser (DNonEmpty a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Parser a] -> Parser [a]
forall (t :: * -> *) (m :: * -> *) a.
(Traversable t, Monad m) =>
t (m a) -> m (t a)
Tr.sequence ([Parser a] -> Parser [a])
-> (Array -> [Parser a]) -> Array -> Parser [a]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Int -> Value -> Parser a) -> [Int] -> [Value] -> [Parser a]
forall a b c. (a -> b -> c) -> [a] -> [b] -> [c]
zipWith ((Value -> Parser a) -> Int -> Value -> Parser a
forall a. (Value -> Parser a) -> Int -> Value -> Parser a
parseIndexedJSON Value -> Parser a
p) [Int
0..] ([Value] -> [Parser a])
-> (Array -> [Value]) -> Array -> [Parser a]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Array -> [Value]
forall a. Vector a -> [a]
V.toList
where
ne :: [a] -> m (DNonEmpty a)
ne [] = String -> m (DNonEmpty a)
forall (m :: * -> *) a. MonadFail m => String -> m a
fail String
"parsing DNonEmpty failed, unexpected empty list"
ne (a
x:[a]
xs) = DNonEmpty a -> m (DNonEmpty a)
forall (f :: * -> *) a. Applicative f => a -> f a
pure (NonEmpty a -> DNonEmpty a
forall a. NonEmpty a -> DNonEmpty a
DNE.fromNonEmpty (a
x a -> [a] -> NonEmpty a
forall a. a -> [a] -> NonEmpty a
:| [a]
xs))
{-# INLINE liftParseJSON #-}
instance (FromJSON a) => FromJSON (DNE.DNonEmpty a) where
parseJSON :: Value -> Parser (DNonEmpty a)
parseJSON = Value -> Parser (DNonEmpty a)
forall (f :: * -> *) a.
(FromJSON1 f, FromJSON a) =>
Value -> Parser (f a)
parseJSON1
{-# INLINE parseJSON #-}
#endif
instance FromJSON1 Identity where
liftParseJSON :: (Value -> Parser a)
-> (Value -> Parser [a]) -> Value -> Parser (Identity a)
liftParseJSON Value -> Parser a
p Value -> Parser [a]
_ Value
a = a -> Identity a
forall a. a -> Identity a
Identity (a -> Identity a) -> Parser a -> Parser (Identity a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Value -> Parser a
p Value
a
{-# INLINE liftParseJSON #-}
liftParseJSONList :: (Value -> Parser a)
-> (Value -> Parser [a]) -> Value -> Parser [Identity a]
liftParseJSONList Value -> Parser a
_ Value -> Parser [a]
p Value
a = (a -> Identity a) -> [a] -> [Identity a]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap a -> Identity a
forall a. a -> Identity a
Identity ([a] -> [Identity a]) -> Parser [a] -> Parser [Identity a]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Value -> Parser [a]
p Value
a
{-# INLINE liftParseJSONList #-}
instance (FromJSON a) => FromJSON (Identity a) where
parseJSON :: Value -> Parser (Identity a)
parseJSON = Value -> Parser (Identity a)
forall (f :: * -> *) a.
(FromJSON1 f, FromJSON a) =>
Value -> Parser (f a)
parseJSON1
{-# INLINE parseJSON #-}
parseJSONList :: Value -> Parser [Identity a]
parseJSONList = (Value -> Parser a)
-> (Value -> Parser [a]) -> Value -> Parser [Identity a]
forall (f :: * -> *) a.
FromJSON1 f =>
(Value -> Parser a)
-> (Value -> Parser [a]) -> Value -> Parser [f a]
liftParseJSONList Value -> Parser a
forall a. FromJSON a => Value -> Parser a
parseJSON Value -> Parser [a]
forall a. FromJSON a => Value -> Parser [a]
parseJSONList
{-# INLINE parseJSONList #-}
instance (FromJSONKey a) => FromJSONKey (Identity a) where
fromJSONKey :: FromJSONKeyFunction (Identity a)
fromJSONKey = FromJSONKeyFunction a -> FromJSONKeyFunction (Identity a)
forall a b.
Coercible a b =>
FromJSONKeyFunction a -> FromJSONKeyFunction b
coerceFromJSONKeyFunction (FromJSONKeyFunction a
forall a. FromJSONKey a => FromJSONKeyFunction a
fromJSONKey :: FromJSONKeyFunction a)
fromJSONKeyList :: FromJSONKeyFunction [Identity a]
fromJSONKeyList = FromJSONKeyFunction [a] -> FromJSONKeyFunction [Identity a]
forall a b.
Coercible a b =>
FromJSONKeyFunction a -> FromJSONKeyFunction b
coerceFromJSONKeyFunction (FromJSONKeyFunction [a]
forall a. FromJSONKey a => FromJSONKeyFunction [a]
fromJSONKeyList :: FromJSONKeyFunction [a])
instance (FromJSON1 f, FromJSON1 g) => FromJSON1 (Compose f g) where
liftParseJSON :: (Value -> Parser a)
-> (Value -> Parser [a]) -> Value -> Parser (Compose f g a)
liftParseJSON Value -> Parser a
p Value -> Parser [a]
pl Value
a = f (g a) -> Compose f g a
forall k k1 (f :: k -> *) (g :: k1 -> k) (a :: k1).
f (g a) -> Compose f g a
Compose (f (g a) -> Compose f g a)
-> Parser (f (g a)) -> Parser (Compose f g a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Value -> Parser (g a))
-> (Value -> Parser [g a]) -> Value -> Parser (f (g a))
forall (f :: * -> *) a.
FromJSON1 f =>
(Value -> Parser a)
-> (Value -> Parser [a]) -> Value -> Parser (f a)
liftParseJSON Value -> Parser (g a)
g Value -> Parser [g a]
gl Value
a
where
g :: Value -> Parser (g a)
g = (Value -> Parser a)
-> (Value -> Parser [a]) -> Value -> Parser (g a)
forall (f :: * -> *) a.
FromJSON1 f =>
(Value -> Parser a)
-> (Value -> Parser [a]) -> Value -> Parser (f a)
liftParseJSON Value -> Parser a
p Value -> Parser [a]
pl
gl :: Value -> Parser [g a]
gl = (Value -> Parser a)
-> (Value -> Parser [a]) -> Value -> Parser [g a]
forall (f :: * -> *) a.
FromJSON1 f =>
(Value -> Parser a)
-> (Value -> Parser [a]) -> Value -> Parser [f a]
liftParseJSONList Value -> Parser a
p Value -> Parser [a]
pl
{-# INLINE liftParseJSON #-}
liftParseJSONList :: (Value -> Parser a)
-> (Value -> Parser [a]) -> Value -> Parser [Compose f g a]
liftParseJSONList Value -> Parser a
p Value -> Parser [a]
pl Value
a = (f (g a) -> Compose f g a) -> [f (g a)] -> [Compose f g a]
forall a b. (a -> b) -> [a] -> [b]
map f (g a) -> Compose f g a
forall k k1 (f :: k -> *) (g :: k1 -> k) (a :: k1).
f (g a) -> Compose f g a
Compose ([f (g a)] -> [Compose f g a])
-> Parser [f (g a)] -> Parser [Compose f g a]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Value -> Parser (g a))
-> (Value -> Parser [g a]) -> Value -> Parser [f (g a)]
forall (f :: * -> *) a.
FromJSON1 f =>
(Value -> Parser a)
-> (Value -> Parser [a]) -> Value -> Parser [f a]
liftParseJSONList Value -> Parser (g a)
g Value -> Parser [g a]
gl Value
a
where
g :: Value -> Parser (g a)
g = (Value -> Parser a)
-> (Value -> Parser [a]) -> Value -> Parser (g a)
forall (f :: * -> *) a.
FromJSON1 f =>
(Value -> Parser a)
-> (Value -> Parser [a]) -> Value -> Parser (f a)
liftParseJSON Value -> Parser a
p Value -> Parser [a]
pl
gl :: Value -> Parser [g a]
gl = (Value -> Parser a)
-> (Value -> Parser [a]) -> Value -> Parser [g a]
forall (f :: * -> *) a.
FromJSON1 f =>
(Value -> Parser a)
-> (Value -> Parser [a]) -> Value -> Parser [f a]
liftParseJSONList Value -> Parser a
p Value -> Parser [a]
pl
{-# INLINE liftParseJSONList #-}
instance (FromJSON1 f, FromJSON1 g, FromJSON a) => FromJSON (Compose f g a) where
parseJSON :: Value -> Parser (Compose f g a)
parseJSON = Value -> Parser (Compose f g a)
forall (f :: * -> *) a.
(FromJSON1 f, FromJSON a) =>
Value -> Parser (f a)
parseJSON1
{-# INLINE parseJSON #-}
parseJSONList :: Value -> Parser [Compose f g a]
parseJSONList = (Value -> Parser a)
-> (Value -> Parser [a]) -> Value -> Parser [Compose f g a]
forall (f :: * -> *) a.
FromJSON1 f =>
(Value -> Parser a)
-> (Value -> Parser [a]) -> Value -> Parser [f a]
liftParseJSONList Value -> Parser a
forall a. FromJSON a => Value -> Parser a
parseJSON Value -> Parser [a]
forall a. FromJSON a => Value -> Parser [a]
parseJSONList
{-# INLINE parseJSONList #-}
instance (FromJSON1 f, FromJSON1 g) => FromJSON1 (Product f g) where
liftParseJSON :: (Value -> Parser a)
-> (Value -> Parser [a]) -> Value -> Parser (Product f g a)
liftParseJSON Value -> Parser a
p Value -> Parser [a]
pl Value
a = (f a -> g a -> Product f g a) -> (f a, g a) -> Product f g a
forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry f a -> g a -> Product f g a
forall k (f :: k -> *) (g :: k -> *) (a :: k).
f a -> g a -> Product f g a
Pair ((f a, g a) -> Product f g a)
-> Parser (f a, g a) -> Parser (Product f g a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Value -> Parser (f a))
-> (Value -> Parser [f a])
-> (Value -> Parser (g a))
-> (Value -> Parser [g a])
-> Value
-> Parser (f a, g a)
forall (f :: * -> * -> *) a b.
FromJSON2 f =>
(Value -> Parser a)
-> (Value -> Parser [a])
-> (Value -> Parser b)
-> (Value -> Parser [b])
-> Value
-> Parser (f a b)
liftParseJSON2 Value -> Parser (f a)
px Value -> Parser [f a]
pxl Value -> Parser (g a)
py Value -> Parser [g a]
pyl Value
a
where
px :: Value -> Parser (f a)
px = (Value -> Parser a)
-> (Value -> Parser [a]) -> Value -> Parser (f a)
forall (f :: * -> *) a.
FromJSON1 f =>
(Value -> Parser a)
-> (Value -> Parser [a]) -> Value -> Parser (f a)
liftParseJSON Value -> Parser a
p Value -> Parser [a]
pl
pxl :: Value -> Parser [f a]
pxl = (Value -> Parser a)
-> (Value -> Parser [a]) -> Value -> Parser [f a]
forall (f :: * -> *) a.
FromJSON1 f =>
(Value -> Parser a)
-> (Value -> Parser [a]) -> Value -> Parser [f a]
liftParseJSONList Value -> Parser a
p Value -> Parser [a]
pl
py :: Value -> Parser (g a)
py = (Value -> Parser a)
-> (Value -> Parser [a]) -> Value -> Parser (g a)
forall (f :: * -> *) a.
FromJSON1 f =>
(Value -> Parser a)
-> (Value -> Parser [a]) -> Value -> Parser (f a)
liftParseJSON Value -> Parser a
p Value -> Parser [a]
pl
pyl :: Value -> Parser [g a]
pyl = (Value -> Parser a)
-> (Value -> Parser [a]) -> Value -> Parser [g a]
forall (f :: * -> *) a.
FromJSON1 f =>
(Value -> Parser a)
-> (Value -> Parser [a]) -> Value -> Parser [f a]
liftParseJSONList Value -> Parser a
p Value -> Parser [a]
pl
{-# INLINE liftParseJSON #-}
instance (FromJSON1 f, FromJSON1 g, FromJSON a) => FromJSON (Product f g a) where
parseJSON :: Value -> Parser (Product f g a)
parseJSON = Value -> Parser (Product f g a)
forall (f :: * -> *) a.
(FromJSON1 f, FromJSON a) =>
Value -> Parser (f a)
parseJSON1
{-# INLINE parseJSON #-}
instance (FromJSON1 f, FromJSON1 g) => FromJSON1 (Sum f g) where
liftParseJSON :: (Value -> Parser a)
-> (Value -> Parser [a]) -> Value -> Parser (Sum f g a)
liftParseJSON Value -> Parser a
p Value -> Parser [a]
pl (Object (Object -> [(Text, Value)]
forall k v. HashMap k v -> [(k, v)]
H.toList -> [(Text
key, Value
value)]))
| Text
key Text -> Text -> Bool
forall a. Eq a => a -> a -> Bool
== Text
inl = f a -> Sum f g a
forall k (f :: k -> *) (g :: k -> *) (a :: k). f a -> Sum f g a
InL (f a -> Sum f g a) -> Parser (f a) -> Parser (Sum f g a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Value -> Parser a)
-> (Value -> Parser [a]) -> Value -> Parser (f a)
forall (f :: * -> *) a.
FromJSON1 f =>
(Value -> Parser a)
-> (Value -> Parser [a]) -> Value -> Parser (f a)
liftParseJSON Value -> Parser a
p Value -> Parser [a]
pl Value
value Parser (f a) -> JSONPathElement -> Parser (f a)
forall a. Parser a -> JSONPathElement -> Parser a
<?> Text -> JSONPathElement
Key Text
inl
| Text
key Text -> Text -> Bool
forall a. Eq a => a -> a -> Bool
== Text
inr = g a -> Sum f g a
forall k (f :: k -> *) (g :: k -> *) (a :: k). g a -> Sum f g a
InR (g a -> Sum f g a) -> Parser (g a) -> Parser (Sum f g a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Value -> Parser a)
-> (Value -> Parser [a]) -> Value -> Parser (g a)
forall (f :: * -> *) a.
FromJSON1 f =>
(Value -> Parser a)
-> (Value -> Parser [a]) -> Value -> Parser (f a)
liftParseJSON Value -> Parser a
p Value -> Parser [a]
pl Value
value Parser (g a) -> JSONPathElement -> Parser (g a)
forall a. Parser a -> JSONPathElement -> Parser a
<?> Text -> JSONPathElement
Key Text
inl
where
inl, inr :: Text
inl :: Text
inl = Text
"InL"
inr :: Text
inr = Text
"InR"
liftParseJSON Value -> Parser a
_ Value -> Parser [a]
_ Value
_ = String -> Parser (Sum f g a)
forall (m :: * -> *) a. MonadFail m => String -> m a
fail (String -> Parser (Sum f g a)) -> String -> Parser (Sum f g a)
forall a b. (a -> b) -> a -> b
$
String
"parsing Sum failed, expected an object with a single property " String -> String -> String
forall a. [a] -> [a] -> [a]
++
String
"where the property key should be either " String -> String -> String
forall a. [a] -> [a] -> [a]
++
String
"\"InL\" or \"InR\""
{-# INLINE liftParseJSON #-}
instance (FromJSON1 f, FromJSON1 g, FromJSON a) => FromJSON (Sum f g a) where
parseJSON :: Value -> Parser (Sum f g a)
parseJSON = Value -> Parser (Sum f g a)
forall (f :: * -> *) a.
(FromJSON1 f, FromJSON a) =>
Value -> Parser (f a)
parseJSON1
{-# INLINE parseJSON #-}
instance FromJSON1 Seq.Seq where
liftParseJSON :: (Value -> Parser a)
-> (Value -> Parser [a]) -> Value -> Parser (Seq a)
liftParseJSON Value -> Parser a
p Value -> Parser [a]
_ = String -> (Array -> Parser (Seq a)) -> Value -> Parser (Seq a)
forall a. String -> (Array -> Parser a) -> Value -> Parser a
withArray String
"Seq" ((Array -> Parser (Seq a)) -> Value -> Parser (Seq a))
-> (Array -> Parser (Seq a)) -> Value -> Parser (Seq a)
forall a b. (a -> b) -> a -> b
$
([a] -> Seq a) -> Parser [a] -> Parser (Seq a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap [a] -> Seq a
forall a. [a] -> Seq a
Seq.fromList (Parser [a] -> Parser (Seq a))
-> (Array -> Parser [a]) -> Array -> Parser (Seq a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
[Parser a] -> Parser [a]
forall (t :: * -> *) (m :: * -> *) a.
(Traversable t, Monad m) =>
t (m a) -> m (t a)
Tr.sequence ([Parser a] -> Parser [a])
-> (Array -> [Parser a]) -> Array -> Parser [a]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Int -> Value -> Parser a) -> [Int] -> [Value] -> [Parser a]
forall a b c. (a -> b -> c) -> [a] -> [b] -> [c]
zipWith ((Value -> Parser a) -> Int -> Value -> Parser a
forall a. (Value -> Parser a) -> Int -> Value -> Parser a
parseIndexedJSON Value -> Parser a
p) [Int
0..] ([Value] -> [Parser a])
-> (Array -> [Value]) -> Array -> [Parser a]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Array -> [Value]
forall a. Vector a -> [a]
V.toList
{-# INLINE liftParseJSON #-}
instance (FromJSON a) => FromJSON (Seq.Seq a) where
parseJSON :: Value -> Parser (Seq a)
parseJSON = Value -> Parser (Seq a)
forall (f :: * -> *) a.
(FromJSON1 f, FromJSON a) =>
Value -> Parser (f a)
parseJSON1
{-# INLINE parseJSON #-}
instance (Ord a, FromJSON a) => FromJSON (Set.Set a) where
parseJSON :: Value -> Parser (Set a)
parseJSON = ([a] -> Set a) -> Parser [a] -> Parser (Set a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap [a] -> Set a
forall a. Ord a => [a] -> Set a
Set.fromList (Parser [a] -> Parser (Set a))
-> (Value -> Parser [a]) -> Value -> Parser (Set a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Value -> Parser [a]
forall a. FromJSON a => Value -> Parser a
parseJSON
{-# INLINE parseJSON #-}
instance FromJSON IntSet.IntSet where
parseJSON :: Value -> Parser IntSet
parseJSON = ([Int] -> IntSet) -> Parser [Int] -> Parser IntSet
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap [Int] -> IntSet
IntSet.fromList