{-# OPTIONS_GHC -Wall #-} {-# LANGUAGE OverloadedStrings #-} module ToySolver.Internal.JSON where import Control.Monad import qualified Data.Aeson as J import qualified Data.Aeson.Types as J import Data.Aeson ((.:)) withTypedObject :: String -> (J.Object -> J.Parser a) -> J.Value -> J.Parser a withTypedObject :: forall a. String -> (Object -> Parser a) -> Value -> Parser a withTypedObject String name Object -> Parser a k = String -> (Object -> Parser a) -> Value -> Parser a forall a. String -> (Object -> Parser a) -> Value -> Parser a J.withObject String name ((Object -> Parser a) -> Value -> Parser a) -> (Object -> Parser a) -> Value -> Parser a forall a b. (a -> b) -> a -> b $ \Object obj -> do String t <- Object obj Object -> Key -> Parser String forall a. FromJSON a => Object -> Key -> Parser a .: Key "type" Bool -> Parser () -> Parser () forall (f :: * -> *). Applicative f => Bool -> f () -> f () unless (String t String -> String -> Bool forall a. Eq a => a -> a -> Bool == String name) (Parser () -> Parser ()) -> Parser () -> Parser () forall a b. (a -> b) -> a -> b $ String -> Parser () forall a. String -> Parser a forall (m :: * -> *) a. MonadFail m => String -> m a fail (String "expected type " String -> String -> String forall a. [a] -> [a] -> [a] ++ String -> String forall a. Show a => a -> String show String name String -> String -> String forall a. [a] -> [a] -> [a] ++ String ", but found type " String -> String -> String forall a. [a] -> [a] -> [a] ++ String -> String forall a. Show a => a -> String show String t) Object -> Parser a k Object obj