{-# LANGUAGE OverloadedStrings #-}
{-# OPTIONS_GHC -fno-warn-orphans #-}
module Swarm.Language.JSON where
import Data.Aeson (FromJSON (..), ToJSON (..), genericParseJSON, genericToJSON, withText)
import Data.Aeson qualified as Ae
import Swarm.Language.Pipeline (processTermEither)
import Swarm.Language.Syntax (Term)
import Swarm.Language.Syntax.Pattern (Syntax, TSyntax)
import Swarm.Language.Value (Env, Value (..))
import Swarm.Pretty (prettyText)
import Swarm.Util.JSON (optionsMinimize)
import Witch (into)
instance FromJSON TSyntax where
parseJSON :: Value -> Parser TSyntax
parseJSON = String -> (Text -> Parser TSyntax) -> Value -> Parser TSyntax
forall a. String -> (Text -> Parser a) -> Value -> Parser a
withText String
"Term" ((Text -> Parser TSyntax) -> Value -> Parser TSyntax)
-> (Text -> Parser TSyntax) -> Value -> Parser TSyntax
forall a b. (a -> b) -> a -> b
$ (Text -> Parser TSyntax)
-> (TSyntax -> Parser TSyntax)
-> Either Text TSyntax
-> Parser TSyntax
forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either (String -> Parser TSyntax
forall a. String -> Parser a
forall (m :: * -> *) a. MonadFail m => String -> m a
fail (String -> Parser TSyntax)
-> (Text -> String) -> Text -> Parser TSyntax
forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall target source. From source target => source -> target
into @String) TSyntax -> Parser TSyntax
forall a. a -> Parser a
forall (m :: * -> *) a. Monad m => a -> m a
return (Either Text TSyntax -> Parser TSyntax)
-> (Text -> Either Text TSyntax) -> Text -> Parser TSyntax
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> Either Text TSyntax
processTermEither
instance ToJSON TSyntax where
toJSON :: TSyntax -> Value
toJSON = Text -> Value
Ae.String (Text -> Value) -> (TSyntax -> Text) -> TSyntax -> Value
forall b c a. (b -> c) -> (a -> b) -> a -> c
. TSyntax -> Text
forall a. PrettyPrec a => a -> Text
prettyText
instance FromJSON Term where
parseJSON :: Value -> Parser Term
parseJSON = Options -> Value -> Parser Term
forall a.
(Generic a, GFromJSON Zero (Rep a)) =>
Options -> Value -> Parser a
genericParseJSON Options
optionsMinimize
instance FromJSON Syntax where
parseJSON :: Value -> Parser (Syntax' ())
parseJSON = Options -> Value -> Parser (Syntax' ())
forall a.
(Generic a, GFromJSON Zero (Rep a)) =>
Options -> Value -> Parser a
genericParseJSON Options
optionsMinimize
instance ToJSON Term where
toJSON :: Term -> Value
toJSON = Options -> Term -> Value
forall a.
(Generic a, GToJSON' Value Zero (Rep a)) =>
Options -> a -> Value
genericToJSON Options
optionsMinimize
instance ToJSON Syntax where
toJSON :: Syntax' () -> Value
toJSON = Options -> Syntax' () -> Value
forall a.
(Generic a, GToJSON' Value Zero (Rep a)) =>
Options -> a -> Value
genericToJSON Options
optionsMinimize
instance ToJSON Value where
toJSON :: Value -> Value
toJSON = Options -> Value -> Value
forall a.
(Generic a, GToJSON' Value Zero (Rep a)) =>
Options -> a -> Value
genericToJSON Options
optionsMinimize
instance ToJSON Env where
toJSON :: Env -> Value
toJSON = Options -> Env -> Value
forall a.
(Generic a, GToJSON' Value Zero (Rep a)) =>
Options -> a -> Value
genericToJSON Options
optionsMinimize