{-# LANGUAGE DataKinds            #-}
{-# LANGUAGE FlexibleContexts     #-}
{-# LANGUAGE FlexibleInstances    #-}
{-# LANGUAGE StandaloneDeriving   #-}
{-# LANGUAGE TypeFamilies         #-}
{-# LANGUAGE TypeOperators        #-}
{-# LANGUAGE UndecidableInstances #-}

{- |
Copyright: (c) 2017-2019 Kowainik
SPDX-License-Identifier: MPL-2.0
Maintainer: Kowainik <xrom.xkov@gmail.com>

Summoner configurations.
-}

module Summoner.Config
       ( ConfigP (..)

       , PartialConfig
       , Config
       , configCodec
       , defaultConfig
       , guessConfigFromGit
       , finalise

       , loadFileConfig
       ) where

import Data.List (lookup)
import Generic.Data (gmappend, gmempty)
import Shellmet (($?), ($|))
import Toml (Key, TomlBiMap, TomlCodec, (.=))
import Validation (Validation (..))

import Summoner.CustomPrelude (CustomPrelude (..), customPreludeT)
import Summoner.Decision (Decision (..))
import Summoner.Default (defaultEmail, defaultFullName, defaultLicenseName, defaultOwner)
import Summoner.GhcVer (GhcVer (..), parseGhcVer, showGhcVer)
import Summoner.License (LicenseName (..), parseLicenseName)
import Summoner.Source (Source, sourceCodec)

import qualified Toml


-- | The phase of the configurations.
data Phase
    = Partial
    | Final

{- | Type family to map 'Phase' to the corresponding field. This is a
Higher-Kinded Data approach specialised to custom enumeration.
-}
infixl 3 :-
type family phase :- field where
    'Partial :- field = Last field
    'Final   :- field = field

-- | Potentially incomplete configuration.
data ConfigP (p :: Phase) = ConfigP
    { ConfigP p -> p :- Text
cOwner      :: !(p :- Text)
    , ConfigP p -> p :- Text
cFullName   :: !(p :- Text)
    , ConfigP p -> p :- Text
cEmail      :: !(p :- Text)
    , ConfigP p -> p :- LicenseName
cLicense    :: !(p :- LicenseName)
    , ConfigP p -> p :- [GhcVer]
cGhcVer     :: !(p :- [GhcVer])
    , ConfigP p -> Decision
cCabal      :: !Decision
    , ConfigP p -> Decision
cStack      :: !Decision
    , ConfigP p -> Decision
cGitHub     :: !Decision
    , ConfigP p -> Decision
cGhActions  :: !Decision
    , ConfigP p -> Decision
cTravis     :: !Decision
    , ConfigP p -> Decision
cAppVey     :: !Decision
    , ConfigP p -> Decision
cPrivate    :: !Decision
    , ConfigP p -> Decision
cLib        :: !Decision
    , ConfigP p -> Decision
cExe        :: !Decision
    , ConfigP p -> Decision
cTest       :: !Decision
    , ConfigP p -> Decision
cBench      :: !Decision
    , ConfigP p -> Last CustomPrelude
cPrelude    :: !(Last CustomPrelude)
    , ConfigP p -> [Text]
cExtensions :: ![Text]
    , ConfigP p -> [Text]
cGhcOptions :: ![Text]  -- ^ GHC options to add to each stanza
    , ConfigP p -> [Text]
cGitignore  :: ![Text]
    , ConfigP p -> Any
cNoUpload   :: !Any  -- ^ Do not upload to the GitHub (even if enabled)
    , ConfigP p -> Map FilePath Source
cFiles      :: !(Map FilePath Source)  -- ^ Custom files
    } deriving stock ((forall x. ConfigP p -> Rep (ConfigP p) x)
-> (forall x. Rep (ConfigP p) x -> ConfigP p)
-> Generic (ConfigP p)
forall x. Rep (ConfigP p) x -> ConfigP p
forall x. ConfigP p -> Rep (ConfigP p) x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
forall (p :: Phase) x. Rep (ConfigP p) x -> ConfigP p
forall (p :: Phase) x. ConfigP p -> Rep (ConfigP p) x
$cto :: forall (p :: Phase) x. Rep (ConfigP p) x -> ConfigP p
$cfrom :: forall (p :: Phase) x. ConfigP p -> Rep (ConfigP p) x
Generic)

deriving stock instance
    ( Eq (p :- Text)
    , Eq (p :- LicenseName)
    , Eq (p :- [GhcVer])
    ) => Eq (ConfigP p)

deriving stock instance
    ( Show (p :- Text)
    , Show (p :- LicenseName)
    , Show (p :- [GhcVer])
    ) => Show (ConfigP p)

instance Semigroup PartialConfig where
    <> :: PartialConfig -> PartialConfig -> PartialConfig
(<>) = PartialConfig -> PartialConfig -> PartialConfig
forall a. (Generic a, Semigroup (Rep a ())) => a -> a -> a
gmappend

instance Monoid PartialConfig where
    mempty :: PartialConfig
mempty  = PartialConfig
forall a. (Generic a, Monoid (Rep a ())) => a
gmempty
    mappend :: PartialConfig -> PartialConfig -> PartialConfig
mappend = PartialConfig -> PartialConfig -> PartialConfig
forall a. Semigroup a => a -> a -> a
(<>)

-- | Incomplete configurations.
type PartialConfig = ConfigP 'Partial

-- | Complete configurations.
type Config = ConfigP 'Final

-- | Default 'Config' configurations.
defaultConfig :: PartialConfig
defaultConfig :: PartialConfig
defaultConfig = $WConfigP :: forall (p :: Phase).
(p :- Text)
-> (p :- Text)
-> (p :- Text)
-> (p :- LicenseName)
-> (p :- [GhcVer])
-> Decision
-> Decision
-> Decision
-> Decision
-> Decision
-> Decision
-> Decision
-> Decision
-> Decision
-> Decision
-> Decision
-> Last CustomPrelude
-> [Text]
-> [Text]
-> [Text]
-> Any
-> Map FilePath Source
-> ConfigP p
ConfigP
    { cOwner :: 'Partial :- Text
cOwner        = Maybe Text -> Last Text
forall a. Maybe a -> Last a
Last (Text -> Maybe Text
forall a. a -> Maybe a
Just Text
defaultOwner)
    , cFullName :: 'Partial :- Text
cFullName     = Maybe Text -> Last Text
forall a. Maybe a -> Last a
Last (Text -> Maybe Text
forall a. a -> Maybe a
Just Text
defaultFullName)
    , cEmail :: 'Partial :- Text
cEmail        = Maybe Text -> Last Text
forall a. Maybe a -> Last a
Last (Text -> Maybe Text
forall a. a -> Maybe a
Just Text
defaultEmail)
    , cLicense :: 'Partial :- LicenseName
cLicense      = Maybe LicenseName -> Last LicenseName
forall a. Maybe a -> Last a
Last (LicenseName -> Maybe LicenseName
forall a. a -> Maybe a
Just LicenseName
defaultLicenseName)
    , cGhcVer :: 'Partial :- [GhcVer]
cGhcVer       = Maybe [GhcVer] -> Last [GhcVer]
forall a. Maybe a -> Last a
Last ([GhcVer] -> Maybe [GhcVer]
forall a. a -> Maybe a
Just [])
    , cCabal :: Decision
cCabal        = Decision
Idk
    , cStack :: Decision
cStack        = Decision
Idk
    , cGitHub :: Decision
cGitHub       = Decision
Idk
    , cGhActions :: Decision
cGhActions    = Decision
Idk
    , cTravis :: Decision
cTravis       = Decision
Idk
    , cAppVey :: Decision
cAppVey       = Decision
Idk
    , cPrivate :: Decision
cPrivate      = Decision
Idk
    , cLib :: Decision
cLib          = Decision
Idk
    , cExe :: Decision
cExe          = Decision
Idk
    , cTest :: Decision
cTest         = Decision
Idk
    , cBench :: Decision
cBench        = Decision
Idk
    , cPrelude :: Last CustomPrelude
cPrelude      = Maybe CustomPrelude -> Last CustomPrelude
forall a. Maybe a -> Last a
Last Maybe CustomPrelude
forall a. Maybe a
Nothing
    , cExtensions :: [Text]
cExtensions   = []
    , cGhcOptions :: [Text]
cGhcOptions   = []
    , cGitignore :: [Text]
cGitignore    = []
    , cNoUpload :: Any
cNoUpload     = Bool -> Any
Any Bool
False
    , cFiles :: Map FilePath Source
cFiles        = Map FilePath Source
forall a. Monoid a => a
mempty
    }

-- | Identifies how to read 'Config' data from the @.toml@ file.
configCodec :: TomlCodec PartialConfig
configCodec :: TomlCodec PartialConfig
configCodec = Last Text
-> Last Text
-> Last Text
-> Last LicenseName
-> Last [GhcVer]
-> Decision
-> Decision
-> Decision
-> Decision
-> Decision
-> Decision
-> Decision
-> Decision
-> Decision
-> Decision
-> Decision
-> Last CustomPrelude
-> [Text]
-> [Text]
-> [Text]
-> Any
-> Map FilePath Source
-> PartialConfig
forall (p :: Phase).
(p :- Text)
-> (p :- Text)
-> (p :- Text)
-> (p :- LicenseName)
-> (p :- [GhcVer])
-> Decision
-> Decision
-> Decision
-> Decision
-> Decision
-> Decision
-> Decision
-> Decision
-> Decision
-> Decision
-> Decision
-> Last CustomPrelude
-> [Text]
-> [Text]
-> [Text]
-> Any
-> Map FilePath Source
-> ConfigP p
ConfigP
    (Last Text
 -> Last Text
 -> Last Text
 -> Last LicenseName
 -> Last [GhcVer]
 -> Decision
 -> Decision
 -> Decision
 -> Decision
 -> Decision
 -> Decision
 -> Decision
 -> Decision
 -> Decision
 -> Decision
 -> Decision
 -> Last CustomPrelude
 -> [Text]
 -> [Text]
 -> [Text]
 -> Any
 -> Map FilePath Source
 -> PartialConfig)
-> Codec PartialConfig (Last Text)
-> Codec
     PartialConfig
     (Last Text
      -> Last Text
      -> Last LicenseName
      -> Last [GhcVer]
      -> Decision
      -> Decision
      -> Decision
      -> Decision
      -> Decision
      -> Decision
      -> Decision
      -> Decision
      -> Decision
      -> Decision
      -> Decision
      -> Last CustomPrelude
      -> [Text]
      -> [Text]
      -> [Text]
      -> Any
      -> Map FilePath Source
      -> PartialConfig)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Key -> TomlCodec Text) -> Key -> TomlCodec (Last Text)
forall a. (Key -> TomlCodec a) -> Key -> TomlCodec (Last a)
Toml.last Key -> TomlCodec Text
Toml.text "owner"         TomlCodec (Last Text)
-> (PartialConfig -> Last Text) -> Codec PartialConfig (Last Text)
forall field a object.
Codec field a -> (object -> field) -> Codec object a
.= PartialConfig -> Last Text
forall (p :: Phase). ConfigP p -> p :- Text
cOwner
    Codec
  PartialConfig
  (Last Text
   -> Last Text
   -> Last LicenseName
   -> Last [GhcVer]
   -> Decision
   -> Decision
   -> Decision
   -> Decision
   -> Decision
   -> Decision
   -> Decision
   -> Decision
   -> Decision
   -> Decision
   -> Decision
   -> Last CustomPrelude
   -> [Text]
   -> [Text]
   -> [Text]
   -> Any
   -> Map FilePath Source
   -> PartialConfig)
-> Codec PartialConfig (Last Text)
-> Codec
     PartialConfig
     (Last Text
      -> Last LicenseName
      -> Last [GhcVer]
      -> Decision
      -> Decision
      -> Decision
      -> Decision
      -> Decision
      -> Decision
      -> Decision
      -> Decision
      -> Decision
      -> Decision
      -> Decision
      -> Last CustomPrelude
      -> [Text]
      -> [Text]
      -> [Text]
      -> Any
      -> Map FilePath Source
      -> PartialConfig)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (Key -> TomlCodec Text) -> Key -> TomlCodec (Last Text)
forall a. (Key -> TomlCodec a) -> Key -> TomlCodec (Last a)
Toml.last Key -> TomlCodec Text
Toml.text "fullName"      TomlCodec (Last Text)
-> (PartialConfig -> Last Text) -> Codec PartialConfig (Last Text)
forall field a object.
Codec field a -> (object -> field) -> Codec object a
.= PartialConfig -> Last Text
forall (p :: Phase). ConfigP p -> p :- Text
cFullName
    Codec
  PartialConfig
  (Last Text
   -> Last LicenseName
   -> Last [GhcVer]
   -> Decision
   -> Decision
   -> Decision
   -> Decision
   -> Decision
   -> Decision
   -> Decision
   -> Decision
   -> Decision
   -> Decision
   -> Decision
   -> Last CustomPrelude
   -> [Text]
   -> [Text]
   -> [Text]
   -> Any
   -> Map FilePath Source
   -> PartialConfig)
-> Codec PartialConfig (Last Text)
-> Codec
     PartialConfig
     (Last LicenseName
      -> Last [GhcVer]
      -> Decision
      -> Decision
      -> Decision
      -> Decision
      -> Decision
      -> Decision
      -> Decision
      -> Decision
      -> Decision
      -> Decision
      -> Decision
      -> Last CustomPrelude
      -> [Text]
      -> [Text]
      -> [Text]
      -> Any
      -> Map FilePath Source
      -> PartialConfig)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (Key -> TomlCodec Text) -> Key -> TomlCodec (Last Text)
forall a. (Key -> TomlCodec a) -> Key -> TomlCodec (Last a)
Toml.last Key -> TomlCodec Text
Toml.text "email"         TomlCodec (Last Text)
-> (PartialConfig -> Last Text) -> Codec PartialConfig (Last Text)
forall field a object.
Codec field a -> (object -> field) -> Codec object a
.= PartialConfig -> Last Text
forall (p :: Phase). ConfigP p -> p :- Text
cEmail
    Codec
  PartialConfig
  (Last LicenseName
   -> Last [GhcVer]
   -> Decision
   -> Decision
   -> Decision
   -> Decision
   -> Decision
   -> Decision
   -> Decision
   -> Decision
   -> Decision
   -> Decision
   -> Decision
   -> Last CustomPrelude
   -> [Text]
   -> [Text]
   -> [Text]
   -> Any
   -> Map FilePath Source
   -> PartialConfig)
-> Codec PartialConfig (Last LicenseName)
-> Codec
     PartialConfig
     (Last [GhcVer]
      -> Decision
      -> Decision
      -> Decision
      -> Decision
      -> Decision
      -> Decision
      -> Decision
      -> Decision
      -> Decision
      -> Decision
      -> Decision
      -> Last CustomPrelude
      -> [Text]
      -> [Text]
      -> [Text]
      -> Any
      -> Map FilePath Source
      -> PartialConfig)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (Key -> TomlCodec LicenseName)
-> Key -> TomlCodec (Last LicenseName)
forall a. (Key -> TomlCodec a) -> Key -> TomlCodec (Last a)
Toml.last Key -> TomlCodec LicenseName
license   "license"       TomlCodec (Last LicenseName)
-> (PartialConfig -> Last LicenseName)
-> Codec PartialConfig (Last LicenseName)
forall field a object.
Codec field a -> (object -> field) -> Codec object a
.= PartialConfig -> Last LicenseName
forall (p :: Phase). ConfigP p -> p :- LicenseName
cLicense
    Codec
  PartialConfig
  (Last [GhcVer]
   -> Decision
   -> Decision
   -> Decision
   -> Decision
   -> Decision
   -> Decision
   -> Decision
   -> Decision
   -> Decision
   -> Decision
   -> Decision
   -> Last CustomPrelude
   -> [Text]
   -> [Text]
   -> [Text]
   -> Any
   -> Map FilePath Source
   -> PartialConfig)
-> Codec PartialConfig (Last [GhcVer])
-> Codec
     PartialConfig
     (Decision
      -> Decision
      -> Decision
      -> Decision
      -> Decision
      -> Decision
      -> Decision
      -> Decision
      -> Decision
      -> Decision
      -> Decision
      -> Last CustomPrelude
      -> [Text]
      -> [Text]
      -> [Text]
      -> Any
      -> Map FilePath Source
      -> PartialConfig)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (Key -> TomlCodec [GhcVer]) -> Key -> TomlCodec (Last [GhcVer])
forall a. (Key -> TomlCodec a) -> Key -> TomlCodec (Last a)
Toml.last Key -> TomlCodec [GhcVer]
ghcVerArr "ghcVersions"   TomlCodec (Last [GhcVer])
-> (PartialConfig -> Last [GhcVer])
-> Codec PartialConfig (Last [GhcVer])
forall field a object.
Codec field a -> (object -> field) -> Codec object a
.= PartialConfig -> Last [GhcVer]
forall (p :: Phase). ConfigP p -> p :- [GhcVer]
cGhcVer
    Codec
  PartialConfig
  (Decision
   -> Decision
   -> Decision
   -> Decision
   -> Decision
   -> Decision
   -> Decision
   -> Decision
   -> Decision
   -> Decision
   -> Decision
   -> Last CustomPrelude
   -> [Text]
   -> [Text]
   -> [Text]
   -> Any
   -> Map FilePath Source
   -> PartialConfig)
-> Codec PartialConfig Decision
-> Codec
     PartialConfig
     (Decision
      -> Decision
      -> Decision
      -> Decision
      -> Decision
      -> Decision
      -> Decision
      -> Decision
      -> Decision
      -> Decision
      -> Last CustomPrelude
      -> [Text]
      -> [Text]
      -> [Text]
      -> Any
      -> Map FilePath Source
      -> PartialConfig)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Key -> TomlCodec Decision
decision            "cabal"         TomlCodec Decision
-> (PartialConfig -> Decision) -> Codec PartialConfig Decision
forall field a object.
Codec field a -> (object -> field) -> Codec object a
.= PartialConfig -> Decision
forall (p :: Phase). ConfigP p -> Decision
cCabal
    Codec
  PartialConfig
  (Decision
   -> Decision
   -> Decision
   -> Decision
   -> Decision
   -> Decision
   -> Decision
   -> Decision
   -> Decision
   -> Decision
   -> Last CustomPrelude
   -> [Text]
   -> [Text]
   -> [Text]
   -> Any
   -> Map FilePath Source
   -> PartialConfig)
-> Codec PartialConfig Decision
-> Codec
     PartialConfig
     (Decision
      -> Decision
      -> Decision
      -> Decision
      -> Decision
      -> Decision
      -> Decision
      -> Decision
      -> Decision
      -> Last CustomPrelude
      -> [Text]
      -> [Text]
      -> [Text]
      -> Any
      -> Map FilePath Source
      -> PartialConfig)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Key -> TomlCodec Decision
decision            "stack"         TomlCodec Decision
-> (PartialConfig -> Decision) -> Codec PartialConfig Decision
forall field a object.
Codec field a -> (object -> field) -> Codec object a
.= PartialConfig -> Decision
forall (p :: Phase). ConfigP p -> Decision
cStack
    Codec
  PartialConfig
  (Decision
   -> Decision
   -> Decision
   -> Decision
   -> Decision
   -> Decision
   -> Decision
   -> Decision
   -> Decision
   -> Last CustomPrelude
   -> [Text]
   -> [Text]
   -> [Text]
   -> Any
   -> Map FilePath Source
   -> PartialConfig)
-> Codec PartialConfig Decision
-> Codec
     PartialConfig
     (Decision
      -> Decision
      -> Decision
      -> Decision
      -> Decision
      -> Decision
      -> Decision
      -> Decision
      -> Last CustomPrelude
      -> [Text]
      -> [Text]
      -> [Text]
      -> Any
      -> Map FilePath Source
      -> PartialConfig)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Key -> TomlCodec Decision
decision            "github"        TomlCodec Decision
-> (PartialConfig -> Decision) -> Codec PartialConfig Decision
forall field a object.
Codec field a -> (object -> field) -> Codec object a
.= PartialConfig -> Decision
forall (p :: Phase). ConfigP p -> Decision
cGitHub
    Codec
  PartialConfig
  (Decision
   -> Decision
   -> Decision
   -> Decision
   -> Decision
   -> Decision
   -> Decision
   -> Decision
   -> Last CustomPrelude
   -> [Text]
   -> [Text]
   -> [Text]
   -> Any
   -> Map FilePath Source
   -> PartialConfig)
-> Codec PartialConfig Decision
-> Codec
     PartialConfig
     (Decision
      -> Decision
      -> Decision
      -> Decision
      -> Decision
      -> Decision
      -> Decision
      -> Last CustomPrelude
      -> [Text]
      -> [Text]
      -> [Text]
      -> Any
      -> Map FilePath Source
      -> PartialConfig)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Key -> TomlCodec Decision
decision            "githubActions" TomlCodec Decision
-> (PartialConfig -> Decision) -> Codec PartialConfig Decision
forall field a object.
Codec field a -> (object -> field) -> Codec object a
.= PartialConfig -> Decision
forall (p :: Phase). ConfigP p -> Decision
cGhActions
    Codec
  PartialConfig
  (Decision
   -> Decision
   -> Decision
   -> Decision
   -> Decision
   -> Decision
   -> Decision
   -> Last CustomPrelude
   -> [Text]
   -> [Text]
   -> [Text]
   -> Any
   -> Map FilePath Source
   -> PartialConfig)
-> Codec PartialConfig Decision
-> Codec
     PartialConfig
     (Decision
      -> Decision
      -> Decision
      -> Decision
      -> Decision
      -> Decision
      -> Last CustomPrelude
      -> [Text]
      -> [Text]
      -> [Text]
      -> Any
      -> Map FilePath Source
      -> PartialConfig)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Key -> TomlCodec Decision
decision            "travis"        TomlCodec Decision
-> (PartialConfig -> Decision) -> Codec PartialConfig Decision
forall field a object.
Codec field a -> (object -> field) -> Codec object a
.= PartialConfig -> Decision
forall (p :: Phase). ConfigP p -> Decision
cTravis
    Codec
  PartialConfig
  (Decision
   -> Decision
   -> Decision
   -> Decision
   -> Decision
   -> Decision
   -> Last CustomPrelude
   -> [Text]
   -> [Text]
   -> [Text]
   -> Any
   -> Map FilePath Source
   -> PartialConfig)
-> Codec PartialConfig Decision
-> Codec
     PartialConfig
     (Decision
      -> Decision
      -> Decision
      -> Decision
      -> Decision
      -> Last CustomPrelude
      -> [Text]
      -> [Text]
      -> [Text]
      -> Any
      -> Map FilePath Source
      -> PartialConfig)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Key -> TomlCodec Decision
decision            "appveyor"      TomlCodec Decision
-> (PartialConfig -> Decision) -> Codec PartialConfig Decision
forall field a object.
Codec field a -> (object -> field) -> Codec object a
.= PartialConfig -> Decision
forall (p :: Phase). ConfigP p -> Decision
cAppVey
    Codec
  PartialConfig
  (Decision
   -> Decision
   -> Decision
   -> Decision
   -> Decision
   -> Last CustomPrelude
   -> [Text]
   -> [Text]
   -> [Text]
   -> Any
   -> Map FilePath Source
   -> PartialConfig)
-> Codec PartialConfig Decision
-> Codec
     PartialConfig
     (Decision
      -> Decision
      -> Decision
      -> Decision
      -> Last CustomPrelude
      -> [Text]
      -> [Text]
      -> [Text]
      -> Any
      -> Map FilePath Source
      -> PartialConfig)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Key -> TomlCodec Decision
decision            "private"       TomlCodec Decision
-> (PartialConfig -> Decision) -> Codec PartialConfig Decision
forall field a object.
Codec field a -> (object -> field) -> Codec object a
.= PartialConfig -> Decision
forall (p :: Phase). ConfigP p -> Decision
cPrivate
    Codec
  PartialConfig
  (Decision
   -> Decision
   -> Decision
   -> Decision
   -> Last CustomPrelude
   -> [Text]
   -> [Text]
   -> [Text]
   -> Any
   -> Map FilePath Source
   -> PartialConfig)
-> Codec PartialConfig Decision
-> Codec
     PartialConfig
     (Decision
      -> Decision
      -> Decision
      -> Last CustomPrelude
      -> [Text]
      -> [Text]
      -> [Text]
      -> Any
      -> Map FilePath Source
      -> PartialConfig)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Key -> TomlCodec Decision
decision            "lib"           TomlCodec Decision
-> (PartialConfig -> Decision) -> Codec PartialConfig Decision
forall field a object.
Codec field a -> (object -> field) -> Codec object a
.= PartialConfig -> Decision
forall (p :: Phase). ConfigP p -> Decision
cLib
    Codec
  PartialConfig
  (Decision
   -> Decision
   -> Decision
   -> Last CustomPrelude
   -> [Text]
   -> [Text]
   -> [Text]
   -> Any
   -> Map FilePath Source
   -> PartialConfig)
-> Codec PartialConfig Decision
-> Codec
     PartialConfig
     (Decision
      -> Decision
      -> Last CustomPrelude
      -> [Text]
      -> [Text]
      -> [Text]
      -> Any
      -> Map FilePath Source
      -> PartialConfig)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Key -> TomlCodec Decision
decision            "exe"           TomlCodec Decision
-> (PartialConfig -> Decision) -> Codec PartialConfig Decision
forall field a object.
Codec field a -> (object -> field) -> Codec object a
.= PartialConfig -> Decision
forall (p :: Phase). ConfigP p -> Decision
cExe
    Codec
  PartialConfig
  (Decision
   -> Decision
   -> Last CustomPrelude
   -> [Text]
   -> [Text]
   -> [Text]
   -> Any
   -> Map FilePath Source
   -> PartialConfig)
-> Codec PartialConfig Decision
-> Codec
     PartialConfig
     (Decision
      -> Last CustomPrelude
      -> [Text]
      -> [Text]
      -> [Text]
      -> Any
      -> Map FilePath Source
      -> PartialConfig)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Key -> TomlCodec Decision
decision            "test"          TomlCodec Decision
-> (PartialConfig -> Decision) -> Codec PartialConfig Decision
forall field a object.
Codec field a -> (object -> field) -> Codec object a
.= PartialConfig -> Decision
forall (p :: Phase). ConfigP p -> Decision
cTest
    Codec
  PartialConfig
  (Decision
   -> Last CustomPrelude
   -> [Text]
   -> [Text]
   -> [Text]
   -> Any
   -> Map FilePath Source
   -> PartialConfig)
-> Codec PartialConfig Decision
-> Codec
     PartialConfig
     (Last CustomPrelude
      -> [Text]
      -> [Text]
      -> [Text]
      -> Any
      -> Map FilePath Source
      -> PartialConfig)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Key -> TomlCodec Decision
decision            "bench"         TomlCodec Decision
-> (PartialConfig -> Decision) -> Codec PartialConfig Decision
forall field a object.
Codec field a -> (object -> field) -> Codec object a
.= PartialConfig -> Decision
forall (p :: Phase). ConfigP p -> Decision
cBench
    Codec
  PartialConfig
  (Last CustomPrelude
   -> [Text]
   -> [Text]
   -> [Text]
   -> Any
   -> Map FilePath Source
   -> PartialConfig)
-> Codec PartialConfig (Last CustomPrelude)
-> Codec
     PartialConfig
     ([Text]
      -> [Text] -> [Text] -> Any -> Map FilePath Source -> PartialConfig)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (Key -> TomlCodec CustomPrelude)
-> Key -> TomlCodec (Last CustomPrelude)
forall a. (Key -> TomlCodec a) -> Key -> TomlCodec (Last a)
Toml.last Key -> TomlCodec CustomPrelude
preludeT  "prelude"       TomlCodec (Last CustomPrelude)
-> (PartialConfig -> Last CustomPrelude)
-> Codec PartialConfig (Last CustomPrelude)
forall field a object.
Codec field a -> (object -> field) -> Codec object a
.= PartialConfig -> Last CustomPrelude
forall (p :: Phase). ConfigP p -> Last CustomPrelude
cPrelude
    Codec
  PartialConfig
  ([Text]
   -> [Text] -> [Text] -> Any -> Map FilePath Source -> PartialConfig)
-> Codec PartialConfig [Text]
-> Codec
     PartialConfig
     ([Text] -> [Text] -> Any -> Map FilePath Source -> PartialConfig)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Key -> TomlCodec [Text]
textArr             "extensions"    TomlCodec [Text]
-> (PartialConfig -> [Text]) -> Codec PartialConfig [Text]
forall field a object.
Codec field a -> (object -> field) -> Codec object a
.= PartialConfig -> [Text]
forall (p :: Phase). ConfigP p -> [Text]
cExtensions
    Codec
  PartialConfig
  ([Text] -> [Text] -> Any -> Map FilePath Source -> PartialConfig)
-> Codec PartialConfig [Text]
-> Codec
     PartialConfig
     ([Text] -> Any -> Map FilePath Source -> PartialConfig)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Key -> TomlCodec [Text]
textArr             "ghc-options"   TomlCodec [Text]
-> (PartialConfig -> [Text]) -> Codec PartialConfig [Text]
forall field a object.
Codec field a -> (object -> field) -> Codec object a
.= PartialConfig -> [Text]
forall (p :: Phase). ConfigP p -> [Text]
cGhcOptions
    Codec
  PartialConfig
  ([Text] -> Any -> Map FilePath Source -> PartialConfig)
-> Codec PartialConfig [Text]
-> Codec
     PartialConfig (Any -> Map FilePath Source -> PartialConfig)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Key -> TomlCodec [Text]
textArr             "gitignore"     TomlCodec [Text]
-> (PartialConfig -> [Text]) -> Codec PartialConfig [Text]
forall field a object.
Codec field a -> (object -> field) -> Codec object a
.= PartialConfig -> [Text]
forall (p :: Phase). ConfigP p -> [Text]
cGitignore
    Codec PartialConfig (Any -> Map FilePath Source -> PartialConfig)
-> Codec PartialConfig Any
-> Codec PartialConfig (Map FilePath Source -> PartialConfig)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Key -> TomlCodec Any
Toml.any            "noUpload"      TomlCodec Any -> (PartialConfig -> Any) -> Codec PartialConfig Any
forall field a object.
Codec field a -> (object -> field) -> Codec object a
.= PartialConfig -> Any
forall (p :: Phase). ConfigP p -> Any
cNoUpload
    Codec PartialConfig (Map FilePath Source -> PartialConfig)
-> Codec PartialConfig (Map FilePath Source)
-> TomlCodec PartialConfig
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Key -> TomlCodec (Map FilePath Source)
filesCodec          "files"         TomlCodec (Map FilePath Source)
-> (PartialConfig -> Map FilePath Source)
-> Codec PartialConfig (Map FilePath Source)
forall field a object.
Codec field a -> (object -> field) -> Codec object a
.= PartialConfig -> Map FilePath Source
forall (p :: Phase). ConfigP p -> Map FilePath Source
cFiles
  where
    _GhcVer :: TomlBiMap GhcVer Toml.AnyValue
    _GhcVer :: TomlBiMap GhcVer AnyValue
_GhcVer = (GhcVer -> Text)
-> (Text -> Either Text GhcVer) -> TomlBiMap GhcVer AnyValue
forall a.
(a -> Text) -> (Text -> Either Text a) -> TomlBiMap a AnyValue
Toml._TextBy GhcVer -> Text
showGhcVer (Text -> Maybe GhcVer -> Either Text GhcVer
forall l r. l -> Maybe r -> Either l r
maybeToRight "Wrong GHC version" (Maybe GhcVer -> Either Text GhcVer)
-> (Text -> Maybe GhcVer) -> Text -> Either Text GhcVer
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> Maybe GhcVer
parseGhcVer)

    ghcVerArr :: Key -> TomlCodec [GhcVer]
    ghcVerArr :: Key -> TomlCodec [GhcVer]
ghcVerArr = TomlBiMap GhcVer AnyValue -> Key -> TomlCodec [GhcVer]
forall a. TomlBiMap a AnyValue -> Key -> TomlCodec [a]
Toml.arrayOf TomlBiMap GhcVer AnyValue
_GhcVer

    license :: Key -> TomlCodec LicenseName
    license :: Key -> TomlCodec LicenseName
license = (LicenseName -> Text)
-> (Text -> Either Text LicenseName)
-> Key
-> TomlCodec LicenseName
forall a.
(a -> Text) -> (Text -> Either Text a) -> Key -> TomlCodec a
Toml.textBy LicenseName -> Text
forall b a. (Show a, IsString b) => a -> b
show (Text -> Maybe LicenseName -> Either Text LicenseName
forall l r. l -> Maybe r -> Either l r
maybeToRight "Wrong license" (Maybe LicenseName -> Either Text LicenseName)
-> (Text -> Maybe LicenseName) -> Text -> Either Text LicenseName
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> Maybe LicenseName
parseLicenseName)

    textArr :: Key -> TomlCodec [Text]
    textArr :: Key -> TomlCodec [Text]
textArr = ([Text] -> Maybe [Text])
-> (Maybe [Text] -> [Text])
-> TomlCodec (Maybe [Text])
-> TomlCodec [Text]
forall b a. (b -> a) -> (a -> b) -> TomlCodec a -> TomlCodec b
Toml.dimap [Text] -> Maybe [Text]
forall a. a -> Maybe a
Just Maybe [Text] -> [Text]
forall m. Monoid m => Maybe m -> m
maybeToMonoid (TomlCodec (Maybe [Text]) -> TomlCodec [Text])
-> (Key -> TomlCodec (Maybe [Text])) -> Key -> TomlCodec [Text]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. TomlCodec [Text] -> TomlCodec (Maybe [Text])
forall a. TomlCodec a -> TomlCodec (Maybe a)
Toml.dioptional (TomlCodec [Text] -> TomlCodec (Maybe [Text]))
-> (Key -> TomlCodec [Text]) -> Key -> TomlCodec (Maybe [Text])
forall b c a. (b -> c) -> (a -> b) -> a -> c
. TomlBiMap Text AnyValue -> Key -> TomlCodec [Text]
forall a. TomlBiMap a AnyValue -> Key -> TomlCodec [a]
Toml.arrayOf TomlBiMap Text AnyValue
Toml._Text

    decision :: Key -> TomlCodec Decision
    decision :: Key -> TomlCodec Decision
decision = (Decision -> Maybe Bool)
-> (Maybe Bool -> Decision)
-> TomlCodec (Maybe Bool)
-> TomlCodec Decision
forall b a. (b -> a) -> (a -> b) -> TomlCodec a -> TomlCodec b
Toml.dimap Decision -> Maybe Bool
fromDecision Maybe Bool -> Decision
toDecision (TomlCodec (Maybe Bool) -> TomlCodec Decision)
-> (Key -> TomlCodec (Maybe Bool)) -> Key -> TomlCodec Decision
forall b c a. (b -> c) -> (a -> b) -> a -> c
. TomlCodec Bool -> TomlCodec (Maybe Bool)
forall a. TomlCodec a -> TomlCodec (Maybe a)
Toml.dioptional (TomlCodec Bool -> TomlCodec (Maybe Bool))
-> (Key -> TomlCodec Bool) -> Key -> TomlCodec (Maybe Bool)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Key -> TomlCodec Bool
Toml.bool

    decisionMaybe :: [(Decision, Maybe Bool)]
    decisionMaybe :: [(Decision, Maybe Bool)]
decisionMaybe = [ (Decision
Idk, Maybe Bool
forall a. Maybe a
Nothing)
                    , (Decision
Yes, Bool -> Maybe Bool
forall a. a -> Maybe a
Just Bool
True)
                    , (Decision
Nop, Bool -> Maybe Bool
forall a. a -> Maybe a
Just Bool
False)
                    ]

    fromDecision :: Decision -> Maybe Bool
    fromDecision :: Decision -> Maybe Bool
fromDecision d :: Decision
d = Maybe (Maybe Bool) -> Maybe Bool
forall (m :: * -> *) a. Monad m => m (m a) -> m a
join (Maybe (Maybe Bool) -> Maybe Bool)
-> Maybe (Maybe Bool) -> Maybe Bool
forall a b. (a -> b) -> a -> b
$ Decision -> [(Decision, Maybe Bool)] -> Maybe (Maybe Bool)
forall a b. Eq a => a -> [(a, b)] -> Maybe b
lookup Decision
d [(Decision, Maybe Bool)]
decisionMaybe

    toDecision :: Maybe Bool -> Decision
    toDecision :: Maybe Bool -> Decision
toDecision m :: Maybe Bool
m = Decision -> Maybe Decision -> Decision
forall a. a -> Maybe a -> a
fromMaybe (Text -> Decision
forall a t. (HasCallStack, IsText t) => t -> a
error "Impossible") (Maybe Decision -> Decision) -> Maybe Decision -> Decision
forall a b. (a -> b) -> a -> b
$ Maybe Bool -> [(Maybe Bool, Decision)] -> Maybe Decision
forall a b. Eq a => a -> [(a, b)] -> Maybe b
lookup Maybe Bool
m ([(Maybe Bool, Decision)] -> Maybe Decision)
-> [(Maybe Bool, Decision)] -> Maybe Decision
forall a b. (a -> b) -> a -> b
$ ((Decision, Maybe Bool) -> (Maybe Bool, Decision))
-> [(Decision, Maybe Bool)] -> [(Maybe Bool, Decision)]
forall a b. (a -> b) -> [a] -> [b]
map (Decision, Maybe Bool) -> (Maybe Bool, Decision)
forall a b. (a, b) -> (b, a)
swap [(Decision, Maybe Bool)]
decisionMaybe

    preludeT :: Key -> TomlCodec CustomPrelude
    preludeT :: Key -> TomlCodec CustomPrelude
preludeT = TomlCodec CustomPrelude -> Key -> TomlCodec CustomPrelude
forall a. TomlCodec a -> Key -> TomlCodec a
Toml.table TomlCodec CustomPrelude
customPreludeT

    filesCodec :: Key -> TomlCodec (Map FilePath Source)
    filesCodec :: Key -> TomlCodec (Map FilePath Source)
filesCodec = TomlCodec FilePath
-> TomlCodec Source -> Key -> TomlCodec (Map FilePath Source)
forall k v.
Ord k =>
TomlCodec k -> TomlCodec v -> Key -> TomlCodec (Map k v)
Toml.map (Key -> TomlCodec FilePath
Toml.string "path") TomlCodec Source
sourceCodec

{- | Try to retrieve user information from Git config.
Return the 'PartialConfig' with the corresponding filled fields if the
information is applicable.
-}
guessConfigFromGit :: IO PartialConfig
guessConfigFromGit :: IO PartialConfig
guessConfigFromGit = do
   Maybe Text
gitOwner <- (Text -> Maybe Text
forall a. a -> Maybe a
Just (Text -> Maybe Text) -> IO Text -> IO (Maybe Text)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> "git" FilePath -> [Text] -> IO Text
$| ["config", "user.login"]) IO (Maybe Text) -> IO (Maybe Text) -> IO (Maybe Text)
forall a. IO a -> IO a -> IO a
$? Maybe Text -> IO (Maybe Text)
forall (f :: * -> *) a. Applicative f => a -> f a
pure Maybe Text
forall a. Maybe a
Nothing
   Maybe Text
gitName  <- (Text -> Maybe Text
forall a. a -> Maybe a
Just (Text -> Maybe Text) -> IO Text -> IO (Maybe Text)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> "git" FilePath -> [Text] -> IO Text
$| ["config", "user.name"])  IO (Maybe Text) -> IO (Maybe Text) -> IO (Maybe Text)
forall a. IO a -> IO a -> IO a
$? Maybe Text -> IO (Maybe Text)
forall (f :: * -> *) a. Applicative f => a -> f a
pure Maybe Text
forall a. Maybe a
Nothing
   Maybe Text
gitEmail <- (Text -> Maybe Text
forall a. a -> Maybe a
Just (Text -> Maybe Text) -> IO Text -> IO (Maybe Text)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> "git" FilePath -> [Text] -> IO Text
$| ["config", "user.email"]) IO (Maybe Text) -> IO (Maybe Text) -> IO (Maybe Text)
forall a. IO a -> IO a -> IO a
$? Maybe Text -> IO (Maybe Text)
forall (f :: * -> *) a. Applicative f => a -> f a
pure Maybe Text
forall a. Maybe a
Nothing
   PartialConfig -> IO PartialConfig
forall (f :: * -> *) a. Applicative f => a -> f a
pure (PartialConfig -> IO PartialConfig)
-> PartialConfig -> IO PartialConfig
forall a b. (a -> b) -> a -> b
$ PartialConfig
defaultConfig
       { cOwner :: 'Partial :- Text
cOwner = Maybe Text -> Last Text
forall a. Maybe a -> Last a
Last Maybe Text
gitOwner
       , cFullName :: 'Partial :- Text
cFullName = Maybe Text -> Last Text
forall a. Maybe a -> Last a
Last Maybe Text
gitName
       , cEmail :: 'Partial :- Text
cEmail = Maybe Text -> Last Text
forall a. Maybe a -> Last a
Last Maybe Text
gitEmail
       }

-- | Make sure that all the required configurations options were specified.
finalise :: PartialConfig -> Validation [Text] Config
finalise :: PartialConfig -> Validation [Text] Config
finalise ConfigP{..} = Text
-> Text
-> Text
-> LicenseName
-> [GhcVer]
-> Decision
-> Decision
-> Decision
-> Decision
-> Decision
-> Decision
-> Decision
-> Decision
-> Decision
-> Decision
-> Decision
-> Last CustomPrelude
-> [Text]
-> [Text]
-> [Text]
-> Any
-> Map FilePath Source
-> Config
forall (p :: Phase).
(p :- Text)
-> (p :- Text)
-> (p :- Text)
-> (p :- LicenseName)
-> (p :- [GhcVer])
-> Decision
-> Decision
-> Decision
-> Decision
-> Decision
-> Decision
-> Decision
-> Decision
-> Decision
-> Decision
-> Decision
-> Last CustomPrelude
-> [Text]
-> [Text]
-> [Text]
-> Any
-> Map FilePath Source
-> ConfigP p
ConfigP
    (Text
 -> Text
 -> Text
 -> LicenseName
 -> [GhcVer]
 -> Decision
 -> Decision
 -> Decision
 -> Decision
 -> Decision
 -> Decision
 -> Decision
 -> Decision
 -> Decision
 -> Decision
 -> Decision
 -> Last CustomPrelude
 -> [Text]
 -> [Text]
 -> [Text]
 -> Any
 -> Map FilePath Source
 -> Config)
-> Validation [Text] Text
-> Validation
     [Text]
     (Text
      -> Text
      -> LicenseName
      -> [GhcVer]
      -> Decision
      -> Decision
      -> Decision
      -> Decision
      -> Decision
      -> Decision
      -> Decision
      -> Decision
      -> Decision
      -> Decision
      -> Decision
      -> Last CustomPrelude
      -> [Text]
      -> [Text]
      -> [Text]
      -> Any
      -> Map FilePath Source
      -> Config)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Text -> Last Text -> Validation [Text] Text
forall a. Text -> Last a -> Validation [Text] a
fin  "owner"      Last Text
'Partial :- Text
cOwner
    Validation
  [Text]
  (Text
   -> Text
   -> LicenseName
   -> [GhcVer]
   -> Decision
   -> Decision
   -> Decision
   -> Decision
   -> Decision
   -> Decision
   -> Decision
   -> Decision
   -> Decision
   -> Decision
   -> Decision
   -> Last CustomPrelude
   -> [Text]
   -> [Text]
   -> [Text]
   -> Any
   -> Map FilePath Source
   -> Config)
-> Validation [Text] Text
-> Validation
     [Text]
     (Text
      -> LicenseName
      -> [GhcVer]
      -> Decision
      -> Decision
      -> Decision
      -> Decision
      -> Decision
      -> Decision
      -> Decision
      -> Decision
      -> Decision
      -> Decision
      -> Decision
      -> Last CustomPrelude
      -> [Text]
      -> [Text]
      -> [Text]
      -> Any
      -> Map FilePath Source
      -> Config)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Text -> Last Text -> Validation [Text] Text
forall a. Text -> Last a -> Validation [Text] a
fin  "fullName"   Last Text
'Partial :- Text
cFullName
    Validation
  [Text]
  (Text
   -> LicenseName
   -> [GhcVer]
   -> Decision
   -> Decision
   -> Decision
   -> Decision
   -> Decision
   -> Decision
   -> Decision
   -> Decision
   -> Decision
   -> Decision
   -> Decision
   -> Last CustomPrelude
   -> [Text]
   -> [Text]
   -> [Text]
   -> Any
   -> Map FilePath Source
   -> Config)
-> Validation [Text] Text
-> Validation
     [Text]
     (LicenseName
      -> [GhcVer]
      -> Decision
      -> Decision
      -> Decision
      -> Decision
      -> Decision
      -> Decision
      -> Decision
      -> Decision
      -> Decision
      -> Decision
      -> Decision
      -> Last CustomPrelude
      -> [Text]
      -> [Text]
      -> [Text]
      -> Any
      -> Map FilePath Source
      -> Config)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Text -> Last Text -> Validation [Text] Text
forall a. Text -> Last a -> Validation [Text] a
fin  "email"      Last Text
'Partial :- Text
cEmail
    Validation
  [Text]
  (LicenseName
   -> [GhcVer]
   -> Decision
   -> Decision
   -> Decision
   -> Decision
   -> Decision
   -> Decision
   -> Decision
   -> Decision
   -> Decision
   -> Decision
   -> Decision
   -> Last CustomPrelude
   -> [Text]
   -> [Text]
   -> [Text]
   -> Any
   -> Map FilePath Source
   -> Config)
-> Validation [Text] LicenseName
-> Validation
     [Text]
     ([GhcVer]
      -> Decision
      -> Decision
      -> Decision
      -> Decision
      -> Decision
      -> Decision
      -> Decision
      -> Decision
      -> Decision
      -> Decision
      -> Decision
      -> Last CustomPrelude
      -> [Text]
      -> [Text]
      -> [Text]
      -> Any
      -> Map FilePath Source
      -> Config)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Text -> Last LicenseName -> Validation [Text] LicenseName
forall a. Text -> Last a -> Validation [Text] a
fin  "license"    Last LicenseName
'Partial :- LicenseName
cLicense
    Validation
  [Text]
  ([GhcVer]
   -> Decision
   -> Decision
   -> Decision
   -> Decision
   -> Decision
   -> Decision
   -> Decision
   -> Decision
   -> Decision
   -> Decision
   -> Decision
   -> Last CustomPrelude
   -> [Text]
   -> [Text]
   -> [Text]
   -> Any
   -> Map FilePath Source
   -> Config)
-> Validation [Text] [GhcVer]
-> Validation
     [Text]
     (Decision
      -> Decision
      -> Decision
      -> Decision
      -> Decision
      -> Decision
      -> Decision
      -> Decision
      -> Decision
      -> Decision
      -> Decision
      -> Last CustomPrelude
      -> [Text]
      -> [Text]
      -> [Text]
      -> Any
      -> Map FilePath Source
      -> Config)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Text -> Last [GhcVer] -> Validation [Text] [GhcVer]
forall a. Text -> Last a -> Validation [Text] a
fin  "ghcVersions" Last [GhcVer]
'Partial :- [GhcVer]
cGhcVer
    Validation
  [Text]
  (Decision
   -> Decision
   -> Decision
   -> Decision
   -> Decision
   -> Decision
   -> Decision
   -> Decision
   -> Decision
   -> Decision
   -> Decision
   -> Last CustomPrelude
   -> [Text]
   -> [Text]
   -> [Text]
   -> Any
   -> Map FilePath Source
   -> Config)
-> Validation [Text] Decision
-> Validation
     [Text]
     (Decision
      -> Decision
      -> Decision
      -> Decision
      -> Decision
      -> Decision
      -> Decision
      -> Decision
      -> Decision
      -> Decision
      -> Last CustomPrelude
      -> [Text]
      -> [Text]
      -> [Text]
      -> Any
      -> Map FilePath Source
      -> Config)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Decision -> Validation [Text] Decision
forall (f :: * -> *) a. Applicative f => a -> f a
pure Decision
cCabal
    Validation
  [Text]
  (Decision
   -> Decision
   -> Decision
   -> Decision
   -> Decision
   -> Decision
   -> Decision
   -> Decision
   -> Decision
   -> Decision
   -> Last CustomPrelude
   -> [Text]
   -> [Text]
   -> [Text]
   -> Any
   -> Map FilePath Source
   -> Config)
-> Validation [Text] Decision
-> Validation
     [Text]
     (Decision
      -> Decision
      -> Decision
      -> Decision
      -> Decision
      -> Decision
      -> Decision
      -> Decision
      -> Decision
      -> Last CustomPrelude
      -> [Text]
      -> [Text]
      -> [Text]
      -> Any
      -> Map FilePath Source
      -> Config)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Decision -> Validation [Text] Decision
forall (f :: * -> *) a. Applicative f => a -> f a
pure Decision
cStack
    Validation
  [Text]
  (Decision
   -> Decision
   -> Decision
   -> Decision
   -> Decision
   -> Decision
   -> Decision
   -> Decision
   -> Decision
   -> Last CustomPrelude
   -> [Text]
   -> [Text]
   -> [Text]
   -> Any
   -> Map FilePath Source
   -> Config)
-> Validation [Text] Decision
-> Validation
     [Text]
     (Decision
      -> Decision
      -> Decision
      -> Decision
      -> Decision
      -> Decision
      -> Decision
      -> Decision
      -> Last CustomPrelude
      -> [Text]
      -> [Text]
      -> [Text]
      -> Any
      -> Map FilePath Source
      -> Config)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Decision -> Validation [Text] Decision
forall (f :: * -> *) a. Applicative f => a -> f a
pure Decision
cGitHub
    Validation
  [Text]
  (Decision
   -> Decision
   -> Decision
   -> Decision
   -> Decision
   -> Decision
   -> Decision
   -> Decision
   -> Last CustomPrelude
   -> [Text]
   -> [Text]
   -> [Text]
   -> Any
   -> Map FilePath Source
   -> Config)
-> Validation [Text] Decision
-> Validation
     [Text]
     (Decision
      -> Decision
      -> Decision
      -> Decision
      -> Decision
      -> Decision
      -> Decision
      -> Last CustomPrelude
      -> [Text]
      -> [Text]
      -> [Text]
      -> Any
      -> Map FilePath Source
      -> Config)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Decision -> Validation [Text] Decision
forall (f :: * -> *) a. Applicative f => a -> f a
pure Decision
cGhActions
    Validation
  [Text]
  (Decision
   -> Decision
   -> Decision
   -> Decision
   -> Decision
   -> Decision
   -> Decision
   -> Last CustomPrelude
   -> [Text]
   -> [Text]
   -> [Text]
   -> Any
   -> Map FilePath Source
   -> Config)
-> Validation [Text] Decision
-> Validation
     [Text]
     (Decision
      -> Decision
      -> Decision
      -> Decision
      -> Decision
      -> Decision
      -> Last CustomPrelude
      -> [Text]
      -> [Text]
      -> [Text]
      -> Any
      -> Map FilePath Source
      -> Config)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Decision -> Validation [Text] Decision
forall (f :: * -> *) a. Applicative f => a -> f a
pure Decision
cTravis
    Validation
  [Text]
  (Decision
   -> Decision
   -> Decision
   -> Decision
   -> Decision
   -> Decision
   -> Last CustomPrelude
   -> [Text]
   -> [Text]
   -> [Text]
   -> Any
   -> Map FilePath Source
   -> Config)
-> Validation [Text] Decision
-> Validation
     [Text]
     (Decision
      -> Decision
      -> Decision
      -> Decision
      -> Decision
      -> Last CustomPrelude
      -> [Text]
      -> [Text]
      -> [Text]
      -> Any
      -> Map FilePath Source
      -> Config)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Decision -> Validation [Text] Decision
forall (f :: * -> *) a. Applicative f => a -> f a
pure Decision
cAppVey
    Validation
  [Text]
  (Decision
   -> Decision
   -> Decision
   -> Decision
   -> Decision
   -> Last CustomPrelude
   -> [Text]
   -> [Text]
   -> [Text]
   -> Any
   -> Map FilePath Source
   -> Config)
-> Validation [Text] Decision
-> Validation
     [Text]
     (Decision
      -> Decision
      -> Decision
      -> Decision
      -> Last CustomPrelude
      -> [Text]
      -> [Text]
      -> [Text]
      -> Any
      -> Map FilePath Source
      -> Config)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Decision -> Validation [Text] Decision
forall (f :: * -> *) a. Applicative f => a -> f a
pure Decision
cPrivate
    Validation
  [Text]
  (Decision
   -> Decision
   -> Decision
   -> Decision
   -> Last CustomPrelude
   -> [Text]
   -> [Text]
   -> [Text]
   -> Any
   -> Map FilePath Source
   -> Config)
-> Validation [Text] Decision
-> Validation
     [Text]
     (Decision
      -> Decision
      -> Decision
      -> Last CustomPrelude
      -> [Text]
      -> [Text]
      -> [Text]
      -> Any
      -> Map FilePath Source
      -> Config)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Decision -> Validation [Text] Decision
forall (f :: * -> *) a. Applicative f => a -> f a
pure Decision
cLib
    Validation
  [Text]
  (Decision
   -> Decision
   -> Decision
   -> Last CustomPrelude
   -> [Text]
   -> [Text]
   -> [Text]
   -> Any
   -> Map FilePath Source
   -> Config)
-> Validation [Text] Decision
-> Validation
     [Text]
     (Decision
      -> Decision
      -> Last CustomPrelude
      -> [Text]
      -> [Text]
      -> [Text]
      -> Any
      -> Map FilePath Source
      -> Config)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Decision -> Validation [Text] Decision
forall (f :: * -> *) a. Applicative f => a -> f a
pure Decision
cExe
    Validation
  [Text]
  (Decision
   -> Decision
   -> Last CustomPrelude
   -> [Text]
   -> [Text]
   -> [Text]
   -> Any
   -> Map FilePath Source
   -> Config)
-> Validation [Text] Decision
-> Validation
     [Text]
     (Decision
      -> Last CustomPrelude
      -> [Text]
      -> [Text]
      -> [Text]
      -> Any
      -> Map FilePath Source
      -> Config)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Decision -> Validation [Text] Decision
forall (f :: * -> *) a. Applicative f => a -> f a
pure Decision
cTest
    Validation
  [Text]
  (Decision
   -> Last CustomPrelude
   -> [Text]
   -> [Text]
   -> [Text]
   -> Any
   -> Map FilePath Source
   -> Config)
-> Validation [Text] Decision
-> Validation
     [Text]
     (Last CustomPrelude
      -> [Text]
      -> [Text]
      -> [Text]
      -> Any
      -> Map FilePath Source
      -> Config)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Decision -> Validation [Text] Decision
forall (f :: * -> *) a. Applicative f => a -> f a
pure Decision
cBench
    Validation
  [Text]
  (Last CustomPrelude
   -> [Text]
   -> [Text]
   -> [Text]
   -> Any
   -> Map FilePath Source
   -> Config)
-> Validation [Text] (Last CustomPrelude)
-> Validation
     [Text]
     ([Text]
      -> [Text] -> [Text] -> Any -> Map FilePath Source -> Config)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Last CustomPrelude -> Validation [Text] (Last CustomPrelude)
forall (f :: * -> *) a. Applicative f => a -> f a
pure Last CustomPrelude
cPrelude
    Validation
  [Text]
  ([Text]
   -> [Text] -> [Text] -> Any -> Map FilePath Source -> Config)
-> Validation [Text] [Text]
-> Validation
     [Text] ([Text] -> [Text] -> Any -> Map FilePath Source -> Config)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> [Text] -> Validation [Text] [Text]
forall (f :: * -> *) a. Applicative f => a -> f a
pure [Text]
cExtensions
    Validation
  [Text] ([Text] -> [Text] -> Any -> Map FilePath Source -> Config)
-> Validation [Text] [Text]
-> Validation
     [Text] ([Text] -> Any -> Map FilePath Source -> Config)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> [Text] -> Validation [Text] [Text]
forall (f :: * -> *) a. Applicative f => a -> f a
pure [Text]
cGhcOptions
    Validation [Text] ([Text] -> Any -> Map FilePath Source -> Config)
-> Validation [Text] [Text]
-> Validation [Text] (Any -> Map FilePath Source -> Config)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> [Text] -> Validation [Text] [Text]
forall (f :: * -> *) a. Applicative f => a -> f a
pure [Text]
cGitignore
    Validation [Text] (Any -> Map FilePath Source -> Config)
-> Validation [Text] Any
-> Validation [Text] (Map FilePath Source -> Config)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Any -> Validation [Text] Any
forall (f :: * -> *) a. Applicative f => a -> f a
pure Any
cNoUpload
    Validation [Text] (Map FilePath Source -> Config)
-> Validation [Text] (Map FilePath Source)
-> Validation [Text] Config
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Map FilePath Source -> Validation [Text] (Map FilePath Source)
forall (f :: * -> *) a. Applicative f => a -> f a
pure Map FilePath Source
cFiles
  where
    fin :: Text -> Last a -> Validation [Text] a
    fin :: Text -> Last a -> Validation [Text] a
fin name :: Text
name = Validation [Text] a
-> (a -> Validation [Text] a) -> Maybe a -> Validation [Text] a
forall b a. b -> (a -> b) -> Maybe a -> b
maybe ([Text] -> Validation [Text] a
forall e a. e -> Validation e a
Failure ["Missing field: " Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
name]) a -> Validation [Text] a
forall e a. a -> Validation e a
Success (Maybe a -> Validation [Text] a)
-> (Last a -> Maybe a) -> Last a -> Validation [Text] a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Last a -> Maybe a
forall a. Last a -> Maybe a
getLast

-- | Read configuration from the given file and return it in data type.
loadFileConfig :: MonadIO m => FilePath -> m PartialConfig
loadFileConfig :: FilePath -> m PartialConfig
loadFileConfig = TomlCodec PartialConfig -> FilePath -> m PartialConfig
forall a (m :: * -> *). MonadIO m => TomlCodec a -> FilePath -> m a
Toml.decodeFile TomlCodec PartialConfig
configCodec