etc-0.3.0.0: src/System/Etc/Spec.hs
{-# LANGUAGE CPP #-}
{-# LANGUAGE NoImplicitPrelude #-}
{-# LANGUAGE ScopedTypeVariables #-}
module System.Etc.Spec (
module Types
, parseConfigSpec
, readConfigSpec
) where
import qualified Data.Text.IO as Text (readFile)
import RIO
import qualified RIO.Text as Text
import System.Etc.Internal.Spec.Types as Types
(ConfigSpec, ConfigValue, ConfigurationError (..))
#ifdef WITH_CLI
import qualified Data.Aeson as JSON
#endif
#ifdef WITH_YAML
import qualified System.Etc.Internal.Spec.YAML as YAML
#else
import qualified System.Etc.Internal.Spec.JSON as JSONSpec
#endif
{-|
Parses a text input into a @ConfigSpec@, input can be JSON or YAML (if cabal
flag is set).
-}
#ifdef WITH_CLI
parseConfigSpec
:: (MonadThrow m, JSON.FromJSON cmd)
=> Text -- ^ Text to be parsed
-> m (ConfigSpec cmd) -- ^ returns ConfigSpec
#else
parseConfigSpec
:: (MonadThrow m)
=> Text -- ^ Text to be parsed
-> m (ConfigSpec ()) -- ^ returns ConfigSpec
#endif
#ifdef WITH_YAML
parseConfigSpec = YAML.parseConfigSpec
#else
parseConfigSpec = JSONSpec.parseConfigSpec
#endif
{-|
Reads contents of a file and parses into a @ConfigSpec@, file contents can be
either JSON or YAML (if cabal flag is set).
-}
#ifdef WITH_CLI
readConfigSpec
:: JSON.FromJSON cmd
=> Text -- ^ Filepath where contents are going to be read from and parsed
-> IO (ConfigSpec cmd) -- ^ returns ConfigSpec
#else
readConfigSpec
:: Text -- ^ Filepath where contents are going to be read from and parsed
-> IO (ConfigSpec ()) -- ^ returns ConfigSpec
#endif
readConfigSpec filepath = do
contents <- Text.readFile $ Text.unpack filepath
parseConfigSpec contents