Haskell environment config loader with validation
Haskell
import System.Environment (lookupEnv)
import Text.Read (readMaybe)
data Config = Config { port :: Int, debug :: Bool, appName :: String } deriving (Show)
loadConfig :: IO (Either [String] Config)
loadConfig = do
portVar <- lookupEnv "PORT"
debugVar <- lookupEnv "DEBUG"
nameVar <- lookupEnv "APP_NAME"
let portR = case portVar >>= readMaybe of
Just n | n >= 1 && n <= 65535 -> Right n
_ -> Left ["PORT must be an integer from 1 to 65535"]
debugR = maybe (Right False) (maybe (Left ["DEBUG must be true or false"]) Right . readMaybe) debugVar
nameR = maybe (Left ["APP_NAME is required"]) Right nameVar
pure (Config <$> portR <*> debugR <*> nameR)