{- |
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 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 String
"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
        String
"True"  -> Bool -> Trial Text Bool
forall a. a -> Trial Text a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Bool
True
        String
"False" -> Bool -> Trial Text Bool
forall a. a -> Trial Text a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Bool
False
        String
_ -> Text -> Trial Text Bool
forall e a. e -> Trial e a
fiasco Text
"Incorrect value is set for STAN_USE_DEFAULT_CONFIG"
    EnvVars -> IO EnvVars
forall a. a -> IO a
forall (f :: * -> *) a. Applicative f => a -> f a
pure EnvVars{TaggedTrial Text Bool
envVarsUseDefaultConfigFile :: TaggedTrial Text Bool
envVarsUseDefaultConfigFile :: TaggedTrial Text Bool
..}
  where
    getEnvVar :: String -> (String -> Trial Text a) -> IO (TaggedTrial Text a)
    getEnvVar :: forall a.
String -> (String -> Trial Text a) -> IO (TaggedTrial Text a)
getEnvVar String
var String -> Trial Text a
act = String -> IO (Maybe String)
forall (m :: * -> *). MonadIO m => String -> m (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
<&> \Maybe String
val -> Text -> Trial Text a -> TaggedTrial Text a
forall tag a. tag -> Trial tag a -> TaggedTrial tag a
withTag Text
"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
        Maybe String
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
$ Text
"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
<> Text
" Env Variable is set"

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

envVarsToText :: EnvVars -> Text
envVarsToText :: EnvVars -> Text
envVarsToText EnvVars{TaggedTrial Text Bool
envVarsUseDefaultConfigFile :: EnvVars -> TaggedTrial Text Bool
envVarsUseDefaultConfigFile :: TaggedTrial Text Bool
..} = case TaggedTrial Text Bool
envVarsUseDefaultConfigFile of
    Result DList Text
_ (Text
_, Bool
res) -> Text
"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 DList (Fatality, Text)
_          -> Text
""