{-# OPTIONS_GHC -Wno-orphans #-}
module Hydra.Cardano.Api.NetworkId where
import Hydra.Cardano.Api.Prelude
import Data.Aeson (Value (String), object, withObject, (.:), (.=))
import Hydra.Cardano.Api.NetworkMagic ()
import Test.QuickCheck (oneof)
instance ToJSON NetworkId where
toJSON :: NetworkId -> Value
toJSON = \case
NetworkId
Mainnet -> [Pair] -> Value
object [Key
"tag" Key -> Value -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Text -> Value
String Text
"Mainnet"]
Testnet NetworkMagic
magic ->
[Pair] -> Value
object
[ Key
"tag" Key -> Value -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Text -> Value
String Text
"Testnet"
, Key
"magic" Key -> Value -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= NetworkMagic -> Value
forall a. ToJSON a => a -> Value
toJSON NetworkMagic
magic
]
instance FromJSON NetworkId where
parseJSON :: Value -> Parser NetworkId
parseJSON = String -> (Object -> Parser NetworkId) -> Value -> Parser NetworkId
forall a. String -> (Object -> Parser a) -> Value -> Parser a
withObject String
"NetworkId" ((Object -> Parser NetworkId) -> Value -> Parser NetworkId)
-> (Object -> Parser NetworkId) -> Value -> Parser NetworkId
forall a b. (a -> b) -> a -> b
$ \Object
o -> do
Text
tag <- Object
o Object -> Key -> Parser Text
forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"tag"
case Text
tag :: Text of
Text
"Mainnet" -> NetworkId -> Parser NetworkId
forall a. a -> Parser a
forall (f :: * -> *) a. Applicative f => a -> f a
pure NetworkId
Mainnet
Text
"Testnet" -> NetworkMagic -> NetworkId
Testnet (NetworkMagic -> NetworkId)
-> Parser NetworkMagic -> Parser NetworkId
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Object
o Object -> Key -> Parser NetworkMagic
forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"magic"
Text
_ -> String -> Parser NetworkId
forall a. String -> Parser a
forall (m :: * -> *) a. MonadFail m => String -> m a
fail String
"Expected tag to be Mainnet | Testnet"
instance Arbitrary NetworkId where
arbitrary :: Gen NetworkId
arbitrary = [Gen NetworkId] -> Gen NetworkId
forall a. HasCallStack => [Gen a] -> Gen a
oneof [NetworkId -> Gen NetworkId
forall a. a -> Gen a
forall (f :: * -> *) a. Applicative f => a -> f a
pure NetworkId
Mainnet, NetworkMagic -> NetworkId
Testnet (NetworkMagic -> NetworkId) -> Gen NetworkMagic -> Gen NetworkId
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen NetworkMagic
forall a. Arbitrary a => Gen a
arbitrary]
shrink :: NetworkId -> [NetworkId]
shrink = \case
NetworkId
Mainnet -> []
Testnet NetworkMagic
magic -> NetworkMagic -> NetworkId
Testnet (NetworkMagic -> NetworkId) -> [NetworkMagic] -> [NetworkId]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> NetworkMagic -> [NetworkMagic]
forall a. Arbitrary a => a -> [a]
shrink NetworkMagic
magic