cfg-0.0.1.0: src/Cfg/Env.hs
module Cfg.Env where
import Control.Monad.IO.Class (MonadIO, liftIO)
import Data.List (intersperse)
import Data.Text (Text)
import Data.Text qualified as T
import Data.Text.IO (writeFile)
import Data.Tree (Tree)
import System.Environment (lookupEnv)
import Tree.Append (mayAppendLeafA')
import Prelude hiding (writeFile)
import Cfg.Parser
import Cfg.Source (RootConfig, toRootConfig)
import Cfg
import Cfg.Env.Keys
-- | @since 0.0.1.0
envSourceSep
:: forall m
. (MonadFail m, MonadIO m)
=> Text
-> Tree Text
-> m (Tree Text)
envSourceSep sep = mayAppendLeafA' getLeafFromEnv []
where
getLeafFromEnv :: [Text] -> m (Maybe Text)
getLeafFromEnv keys = do
let
key = foldr (flip mappend) "" $ intersperse sep keys
liftIO $ (fmap T.pack) <$> (lookupEnv $ T.unpack key)
-- | @since 0.0.1.0
envSource :: (MonadFail m, MonadIO m) => Tree Text -> m (Tree Text)
envSource = envSourceSep "_"
-- | @since 0.0.1.0
printDotEnv' :: FilePath -> Text -> Tree Text -> IO ()
printDotEnv' path sep = writeFile path . foldMap (\line -> "export " <> line <> "=\n") . showEnvKeys' sep
-- | @since 0.0.1.0
getEnvConfigSep :: (MonadFail m, MonadIO m, RootConfig a, RootParser a) => Text -> m (Either ConfigParseError a)
getEnvConfigSep sep = getConfig $ envSourceSep sep
-- | @since 0.0.1.0
getEnvConfig :: (MonadFail m, MonadIO m, RootConfig a, RootParser a) => m (Either ConfigParseError a)
getEnvConfig = getConfig $ envSource
-- | @since 0.0.1.0
printDotEnv :: forall a. (RootConfig a) => FilePath -> IO ()
printDotEnv path =
writeFile path
. foldMap (\line -> "export " <> line <> "=\n")
. showEnvKeys' "_"
$ toRootConfig @a