{-# OPTIONS_GHC -Wno-orphans #-}

{-# LANGUAGE DataKinds             #-}
{-# LANGUAGE FlexibleContexts      #-}
{-# LANGUAGE FlexibleInstances     #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE TypeFamilies          #-}

{-|
Module      : GHCup.Types.JSON.Versions
Description : GHCup Version JSON types/instances
Copyright   : (c) Julian Ospald, 2020
License     : LGPL-3.0
Maintainer  : hasufell@hasufell.de
Stability   : experimental
Portability : portable
-}
module GHCup.Types.JSON.Versions where

import           Data.Aeson              hiding (Key)
import           Data.Aeson.Types        hiding (Key)
import           Data.Versions

import qualified Data.Text                     as T

instance ToJSON Versioning where
  toJSON :: Versioning -> Value
toJSON = Text -> Value
forall a. ToJSON a => a -> Value
toJSON (Text -> Value) -> (Versioning -> Text) -> Versioning -> Value
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Versioning -> Text
prettyV

instance FromJSON Versioning where
  parseJSON :: Value -> Parser Versioning
parseJSON = String -> (Text -> Parser Versioning) -> Value -> Parser Versioning
forall a. String -> (Text -> Parser a) -> Value -> Parser a
withText String
"Versioning" ((Text -> Parser Versioning) -> Value -> Parser Versioning)
-> (Text -> Parser Versioning) -> Value -> Parser Versioning
forall a b. (a -> b) -> a -> b
$ \Text
t -> case Text -> Either ParsingError Versioning
versioning Text
t of
    Right Versioning
x -> Versioning -> Parser Versioning
forall a. a -> Parser a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Versioning
x
    Left  ParsingError
e -> String -> Parser Versioning
forall a. String -> Parser a
forall (m :: * -> *) a. MonadFail m => String -> m a
fail (String -> Parser Versioning) -> String -> Parser Versioning
forall a b. (a -> b) -> a -> b
$ String
"Failure in GHCTargetVersion (FromJSON)" String -> String -> String
forall a. Semigroup a => a -> a -> a
<> ParsingError -> String
forall a. Show a => a -> String
show ParsingError
e

instance ToJSONKey Versioning where
  toJSONKey :: ToJSONKeyFunction Versioning
toJSONKey = (Versioning -> Text) -> ToJSONKeyFunction Versioning
forall a. (a -> Text) -> ToJSONKeyFunction a
toJSONKeyText ((Versioning -> Text) -> ToJSONKeyFunction Versioning)
-> (Versioning -> Text) -> ToJSONKeyFunction Versioning
forall a b. (a -> b) -> a -> b
$ \Versioning
x -> Versioning -> Text
prettyV Versioning
x

instance FromJSONKey Versioning where
  fromJSONKey :: FromJSONKeyFunction Versioning
fromJSONKey = (Text -> Parser Versioning) -> FromJSONKeyFunction Versioning
forall a. (Text -> Parser a) -> FromJSONKeyFunction a
FromJSONKeyTextParser ((Text -> Parser Versioning) -> FromJSONKeyFunction Versioning)
-> (Text -> Parser Versioning) -> FromJSONKeyFunction Versioning
forall a b. (a -> b) -> a -> b
$ \Text
t -> case Text -> Either ParsingError Versioning
versioning Text
t of
    Right Versioning
x -> Versioning -> Parser Versioning
forall a. a -> Parser a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Versioning
x
    Left  ParsingError
e -> String -> Parser Versioning
forall a. String -> Parser a
forall (m :: * -> *) a. MonadFail m => String -> m a
fail (String -> Parser Versioning) -> String -> Parser Versioning
forall a b. (a -> b) -> a -> b
$ String
"Failure in Versioning (FromJSONKey)" String -> String -> String
forall a. Semigroup a => a -> a -> a
<> ParsingError -> String
forall a. Show a => a -> String
show ParsingError
e

instance ToJSONKey (Maybe Versioning) where
  toJSONKey :: ToJSONKeyFunction (Maybe Versioning)
toJSONKey = (Maybe Versioning -> Text) -> ToJSONKeyFunction (Maybe Versioning)
forall a. (a -> Text) -> ToJSONKeyFunction a
toJSONKeyText ((Maybe Versioning -> Text)
 -> ToJSONKeyFunction (Maybe Versioning))
-> (Maybe Versioning -> Text)
-> ToJSONKeyFunction (Maybe Versioning)
forall a b. (a -> b) -> a -> b
$ \case
    Just Versioning
x  -> Versioning -> Text
prettyV Versioning
x
    Maybe Versioning
Nothing -> String -> Text
T.pack String
"unknown_versioning"

instance FromJSONKey (Maybe Versioning) where
  fromJSONKey :: FromJSONKeyFunction (Maybe Versioning)
fromJSONKey = (Text -> Parser (Maybe Versioning))
-> FromJSONKeyFunction (Maybe Versioning)
forall a. (Text -> Parser a) -> FromJSONKeyFunction a
FromJSONKeyTextParser ((Text -> Parser (Maybe Versioning))
 -> FromJSONKeyFunction (Maybe Versioning))
-> (Text -> Parser (Maybe Versioning))
-> FromJSONKeyFunction (Maybe Versioning)
forall a b. (a -> b) -> a -> b
$ \Text
t ->
    if Text
t Text -> Text -> Bool
forall a. Eq a => a -> a -> Bool
== String -> Text
T.pack String
"unknown_versioning" then Maybe Versioning -> Parser (Maybe Versioning)
forall a. a -> Parser a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Maybe Versioning
forall a. Maybe a
Nothing else Text -> Parser (Maybe Versioning)
forall {f :: * -> *}. MonadFail f => Text -> f (Maybe Versioning)
just Text
t
   where
    just :: Text -> f (Maybe Versioning)
just Text
t = case Text -> Either ParsingError Versioning
versioning Text
t of
      Right Versioning
x -> Maybe Versioning -> f (Maybe Versioning)
forall a. a -> f a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Maybe Versioning -> f (Maybe Versioning))
-> Maybe Versioning -> f (Maybe Versioning)
forall a b. (a -> b) -> a -> b
$ Versioning -> Maybe Versioning
forall a. a -> Maybe a
Just Versioning
x
      Left  ParsingError
e -> String -> f (Maybe Versioning)
forall a. String -> f a
forall (m :: * -> *) a. MonadFail m => String -> m a
fail (String -> f (Maybe Versioning)) -> String -> f (Maybe Versioning)
forall a b. (a -> b) -> a -> b
$ String
"Failure in (Maybe Versioning) (FromJSONKey)" String -> String -> String
forall a. Semigroup a => a -> a -> a
<> ParsingError -> String
forall a. Show a => a -> String
show ParsingError
e

instance ToJSONKey (Maybe Version) where
  toJSONKey :: ToJSONKeyFunction (Maybe Version)
toJSONKey = (Maybe Version -> Text) -> ToJSONKeyFunction (Maybe Version)
forall a. (a -> Text) -> ToJSONKeyFunction a
toJSONKeyText ((Maybe Version -> Text) -> ToJSONKeyFunction (Maybe Version))
-> (Maybe Version -> Text) -> ToJSONKeyFunction (Maybe Version)
forall a b. (a -> b) -> a -> b
$ \case
    Just Version
x  -> Version -> Text
prettyVer Version
x
    Maybe Version
Nothing -> String -> Text
T.pack String
"unknown_version"

instance FromJSONKey (Maybe Version) where
  fromJSONKey :: FromJSONKeyFunction (Maybe Version)
fromJSONKey = (Text -> Parser (Maybe Version))
-> FromJSONKeyFunction (Maybe Version)
forall a. (Text -> Parser a) -> FromJSONKeyFunction a
FromJSONKeyTextParser ((Text -> Parser (Maybe Version))
 -> FromJSONKeyFunction (Maybe Version))
-> (Text -> Parser (Maybe Version))
-> FromJSONKeyFunction (Maybe Version)
forall a b. (a -> b) -> a -> b
$ \Text
t ->
    if Text
t Text -> Text -> Bool
forall a. Eq a => a -> a -> Bool
== String -> Text
T.pack String
"unknown_version" then Maybe Version -> Parser (Maybe Version)
forall a. a -> Parser a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Maybe Version
forall a. Maybe a
Nothing else Text -> Parser (Maybe Version)
forall {f :: * -> *}. MonadFail f => Text -> f (Maybe Version)
just Text
t
   where
    just :: Text -> f (Maybe Version)
just Text
t = case Text -> Either ParsingError Version
version Text
t of
      Right Version
x -> Maybe Version -> f (Maybe Version)
forall a. a -> f a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Maybe Version -> f (Maybe Version))
-> Maybe Version -> f (Maybe Version)
forall a b. (a -> b) -> a -> b
$ Version -> Maybe Version
forall a. a -> Maybe a
Just Version
x
      Left  ParsingError
e -> String -> f (Maybe Version)
forall a. String -> f a
forall (m :: * -> *) a. MonadFail m => String -> m a
fail (String -> f (Maybe Version)) -> String -> f (Maybe Version)
forall a b. (a -> b) -> a -> b
$ String
"Failure in (Maybe Version) (FromJSONKey)" String -> String -> String
forall a. Semigroup a => a -> a -> a
<> ParsingError -> String
forall a. Show a => a -> String
show ParsingError
e

instance ToJSON Version where
  toJSON :: Version -> Value
toJSON = Text -> Value
forall a. ToJSON a => a -> Value
toJSON (Text -> Value) -> (Version -> Text) -> Version -> Value
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Version -> Text
prettyVer

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) -> Value -> Parser Version)
-> (Text -> Parser Version) -> Value -> Parser Version
forall a b. (a -> b) -> a -> b
$ \Text
t -> case Text -> Either ParsingError Version
version Text
t of
    Right Version
x -> Version -> Parser Version
forall a. a -> Parser a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Version
x
    Left  ParsingError
e -> String -> Parser Version
forall a. String -> Parser a
forall (m :: * -> *) a. MonadFail m => String -> m a
fail (String -> Parser Version) -> String -> Parser Version
forall a b. (a -> b) -> a -> b
$ String
"Failure in Version (FromJSON)" String -> String -> String
forall a. Semigroup a => a -> a -> a
<> ParsingError -> String
forall a. Show a => a -> String
show ParsingError
e

instance ToJSONKey Version where
  toJSONKey :: ToJSONKeyFunction Version
toJSONKey = (Version -> Text) -> ToJSONKeyFunction Version
forall a. (a -> Text) -> ToJSONKeyFunction a
toJSONKeyText ((Version -> Text) -> ToJSONKeyFunction Version)
-> (Version -> Text) -> ToJSONKeyFunction Version
forall a b. (a -> b) -> a -> b
$ \Version
x -> Version -> Text
prettyVer Version
x

instance FromJSONKey Version where
  fromJSONKey :: FromJSONKeyFunction Version
fromJSONKey = (Text -> Parser Version) -> FromJSONKeyFunction Version
forall a. (Text -> Parser a) -> FromJSONKeyFunction a
FromJSONKeyTextParser ((Text -> Parser Version) -> FromJSONKeyFunction Version)
-> (Text -> Parser Version) -> FromJSONKeyFunction Version
forall a b. (a -> b) -> a -> b
$ \Text
t -> case Text -> Either ParsingError Version
version Text
t of
    Right Version
x -> Version -> Parser Version
forall a. a -> Parser a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Version
x
    Left  ParsingError
e -> String -> Parser Version
forall a. String -> Parser a
forall (m :: * -> *) a. MonadFail m => String -> m a
fail (String -> Parser Version) -> String -> Parser Version
forall a b. (a -> b) -> a -> b
$ String
"Failure in Version (FromJSONKey)" String -> String -> String
forall a. Semigroup a => a -> a -> a
<> ParsingError -> String
forall a. Show a => a -> String
show ParsingError
e

instance ToJSON PVP where
  toJSON :: PVP -> Value
toJSON = Text -> Value
forall a. ToJSON a => a -> Value
toJSON (Text -> Value) -> (PVP -> Text) -> PVP -> Value
forall b c a. (b -> c) -> (a -> b) -> a -> c
. PVP -> Text
prettyPVP

instance FromJSON PVP where
  parseJSON :: Value -> Parser PVP
parseJSON = String -> (Text -> Parser PVP) -> Value -> Parser PVP
forall a. String -> (Text -> Parser a) -> Value -> Parser a
withText String
"PVP" ((Text -> Parser PVP) -> Value -> Parser PVP)
-> (Text -> Parser PVP) -> Value -> Parser PVP
forall a b. (a -> b) -> a -> b
$ \Text
t -> case Text -> Either ParsingError PVP
pvp Text
t of
    Right PVP
x -> PVP -> Parser PVP
forall a. a -> Parser a
forall (f :: * -> *) a. Applicative f => a -> f a
pure PVP
x
    Left  ParsingError
e -> String -> Parser PVP
forall a. String -> Parser a
forall (m :: * -> *) a. MonadFail m => String -> m a
fail (String -> Parser PVP) -> String -> Parser PVP
forall a b. (a -> b) -> a -> b
$ String
"Failure in PVP (FromJSON)" String -> String -> String
forall a. Semigroup a => a -> a -> a
<> ParsingError -> String
forall a. Show a => a -> String
show ParsingError
e