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

Environment variables for @stan@.
-}

module Stan.EnvVars
    ( EnvVars (..)
    , getEnvVars

    , envVarsToText
    ) where

import System.Environment (lookupEnv)
import Trial (TaggedTrial, Trial (..), fiasco, withTag)


newtype EnvVars = EnvVars
    { EnvVars -> TaggedTrial Text Bool
envVarsUseDefaultConfigFile :: TaggedTrial Text Bool
    }

getEnvVars :: IO EnvVars
getEnvVars :: IO EnvVars
getEnvVars = do
    TaggedTrial Text Bool
envVarsUseDefaultConfigFile <- String -> (String -> Trial Text Bool) -> IO (TaggedTrial Text Bool)
forall a.
String -> (String -> Trial Text a) -> IO (TaggedTrial Text a)
getEnvVar "STAN_USE_DEFAULT_CONFIG" ((String -> Trial Text Bool) -> IO (TaggedTrial Text Bool))
-> (String -> Trial Text Bool) -> IO (TaggedTrial Text Bool)
forall a b. (a -> b) -> a -> b
$ \case
        "True"  -> Bool -> Trial Text Bool
forall (f :: * -> *) a. Applicative f => a -> f a
pure Bool
True
        "False" -> Bool -> Trial Text Bool
forall (f :: * -> *) a. Applicative f => a -> f a
pure Bool
False
        _ -> Text -> Trial Text Bool
forall e a. e -> Trial e a
fiasco "Incorrect value is set for STAN_USE_DEFAULT_CONFIG"
    EnvVars -> IO EnvVars
forall (f :: * -> *) a. Applicative f => a -> f a
pure EnvVars :: TaggedTrial Text Bool -> EnvVars
EnvVars{..}
  where
    getEnvVar :: String -> (String -> Trial Text a) -> IO (TaggedTrial Text a)
    getEnvVar :: String -> (String -> Trial Text a) -> IO (TaggedTrial Text a)
getEnvVar var :: String
var act :: String -> Trial Text a
act = String -> IO (Maybe String)
lookupEnv String
var IO (Maybe String)
-> (Maybe String -> TaggedTrial Text a) -> IO (TaggedTrial Text a)
forall (f :: * -> *) a b. Functor f => f a -> (a -> b) -> f b
<&> \val :: Maybe String
val -> Text -> Trial Text a -> TaggedTrial Text a
forall tag a. tag -> Trial tag a -> TaggedTrial tag a
withTag "EnvVar" (Trial Text a -> TaggedTrial Text a)
-> Trial Text a -> TaggedTrial Text a
forall a b. (a -> b) -> a -> b
$ case Maybe String
val of
        Nothing -> Text -> Trial Text a
forall e a. e -> Trial e a
fiasco (Text -> Trial Text a) -> Text -> Trial Text a
forall a b. (a -> b) -> a -> b
$ "No " Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> String -> Text
forall a. ToText a => a -> Text
toText String
var Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> " Env Variable is set"

        Just s :: String
s  -> String -> Trial Text a
act String
s

envVarsToText :: EnvVars -> Text
envVarsToText :: EnvVars -> Text
envVarsToText EnvVars{..} = case TaggedTrial Text Bool
envVarsUseDefaultConfigFile of
    Result _ (_, res :: Bool
res) -> "STAN_USE_DEFAULT_CONFIG=" Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Bool -> Text
forall b a. (Show a, IsString b) => a -> b
show Bool
res
    Fiasco _          -> ""