{-# LANGUAGE CPP #-}
{-# LANGUAGE NoImplicitPrelude #-}
{-# LANGUAGE ScopedTypeVariables #-}
module System.Etc.Spec (
module Types
, module Errors
, parseConfigSpec
, readConfigSpecTH
, readConfigSpec
) where
import qualified Data.Text.IO as Text (readFile)
import RIO
import qualified RIO.Text as Text
import Data.Proxy (Proxy)
import Language.Haskell.TH (ExpQ)
import Language.Haskell.TH.Syntax (Lift)
import System.Etc.Internal.Errors as Errors
import System.Etc.Internal.Spec.Types as Types (ConfigSpec, ConfigValue)
import qualified Data.Aeson as JSON
#ifdef WITH_YAML
import qualified System.Etc.Internal.Spec.YAML as YAML
import qualified System.Etc.Internal.Spec.YAML.TH as YAML
#else
import qualified System.Etc.Internal.Spec.JSON as JSONSpec
import qualified System.Etc.Internal.Spec.JSON.TH as JSONSpec
#endif
#ifdef WITH_CLI
parseConfigSpec
:: (MonadThrow m, JSON.FromJSON cmd)
=> Text
-> m (ConfigSpec cmd)
#else
parseConfigSpec
:: (MonadThrow m)
=> Text
-> m (ConfigSpec ())
#endif
#ifdef WITH_YAML
parseConfigSpec = YAML.parseConfigSpec
#else
parseConfigSpec = JSONSpec.parseConfigSpec
#endif
#ifdef WITH_CLI
readConfigSpec
:: JSON.FromJSON cmd
=> Text
-> IO (ConfigSpec cmd)
#else
readConfigSpec
:: Text
-> IO (ConfigSpec ())
#endif
readConfigSpec filepath = do
contents <- Text.readFile $ Text.unpack filepath
parseConfigSpec contents
readConfigSpecTH :: (Lift k, JSON.FromJSON k) => Proxy k -> Text -> ExpQ
#ifdef WITH_YAML
readConfigSpecTH = YAML.readConfigSpecTH
#else
readConfigSpecTH = JSONSpec.readConfigSpecTH
#endif