diff options
Diffstat (limited to 'src/Config.hs')
-rw-r--r-- | src/Config.hs | 34 |
1 files changed, 24 insertions, 10 deletions
diff --git a/src/Config.hs b/src/Config.hs index d494477..071cc26 100644 --- a/src/Config.hs +++ b/src/Config.hs @@ -1,4 +1,4 @@ -{-# LANGUAGE OverloadedStrings #-} +{-# LANGUAGE OverloadedStrings, LambdaCase #-} module Config ( Config(..), @@ -6,9 +6,15 @@ module Config ( makeOpenSearch ) where +import Prelude hiding (lookup) + +import Control.Applicative ((<|>)) +import Data.Aeson.KeyMap (empty, lookup) +import Data.Functor ((<&>)) import Data.Maybe (fromMaybe) import Data.String (fromString, IsString) import Data.Text (Text) +import Data.Yaml import Network.Wai.Handler.Warp (HostPreference) import System.Environment (lookupEnv) @@ -22,15 +28,23 @@ data Config = Config { } deriving (Show, Eq) getConfig :: IO Config -getConfig = Config - <$> (read <$> getEnvOr "PORT" "20546") - <*> getEnvOr "BIND_ADDR" "*6" - <*> getEnvOr "BASE_URL" "http://localhost:20546" - <*> getEnvOr "FAVICON_URL" "https://69owo.de/favicon.ico" - <*> getEnvOr "ADMIN_USER" "bleb" - <*> getEnvOr "ADMIN_PW_HASH" "" -- prevent login without manual pw - where getEnvOr :: IsString s => String -> s -> IO s - getEnvOr q def = fromMaybe def . fmap fromString <$> lookupEnv q +getConfig = do + confFile <- decodeFileEither "fastbangs.yaml" <&> \case + Right ob -> ob + Left _ -> empty + + Config + <$> (read <$> resolveVal (lookup "port" confFile) "PORT" "20546") + <*> resolveVal (lookup "bind-addr" confFile) "BIND_ADDR" "*6" + <*> resolveVal (lookup "base-url" confFile) "BASE_URL" "http://localhost:20546" + <*> resolveVal (lookup "favicon-url" confFile) "FAVICON_URL" "" + <*> resolveVal (lookup "admin-user" confFile) "ADMIN_USER" "bleb" + <*> resolveVal (lookup "admin-pw-hash" confFile) "ADMIN_PW_HASH" "" -- prevent login without manual pw + + where resolveVal :: IsString s => Maybe String -> String -> String -> IO s + resolveVal mayConf q def = do + mayEnv <- lookupEnv q + return $ fromString $ fromMaybe def $ mayEnv <|> mayConf makeOpenSearch :: Config -> Maybe Text -> Text makeOpenSearch cfg defBang = |