aboutsummaryrefslogtreecommitdiff
path: root/lib/Daffm/Configuration.hs
diff options
context:
space:
mode:
authorAkshay Nair <phenax5@gmail.com>2025-10-05 18:49:36 +0530
committerAkshay Nair <phenax5@gmail.com>2025-10-05 18:49:36 +0530
commit577a30cd5894aa16cf81606767d4d07c3e7b1603 (patch)
treea3c50dade9399660ddba1008375f833862cf8839 /lib/Daffm/Configuration.hs
parent845b96c9a7f6d80f2042ef5d334fd6842d617f27 (diff)
downloaddaffm-577a30cd5894aa16cf81606767d4d07c3e7b1603.tar.gz
daffm-577a30cd5894aa16cf81606767d4d07c3e7b1603.zip
Add arg parsing, loading config from XDG_CONFIG_HOME and -c arg for loading config file
Diffstat (limited to 'lib/Daffm/Configuration.hs')
-rw-r--r--lib/Daffm/Configuration.hs28
1 files changed, 26 insertions, 2 deletions
diff --git a/lib/Daffm/Configuration.hs b/lib/Daffm/Configuration.hs
index afcca08..494d2a4 100644
--- a/lib/Daffm/Configuration.hs
+++ b/lib/Daffm/Configuration.hs
@@ -2,6 +2,7 @@ module Daffm.Configuration where
import Control.Arrow (ArrowChoice (left))
import Control.Exception (throwIO)
+import qualified Control.Exception as IO
import Daffm.Action.Commands (parseCommand)
import Daffm.Keymap (parseKeySequence)
import Daffm.Types
@@ -10,12 +11,35 @@ import qualified Data.Map as Map
import Data.Maybe (fromMaybe)
import qualified Data.Text as Text
import qualified Data.Text.IO as Text
+import System.Directory (XdgDirectory (XdgConfig), getXdgDirectory)
+import System.FilePath (joinPath)
import Toml ((.=))
import qualified Toml
-loadConfigFile :: IO Configuration
-loadConfigFile = Text.readFile "./config.toml" >>= parse
+getConfigDir :: IO FilePath
+getConfigDir = getXdgDirectory XdgConfig "daffm"
+
+getDefaultConfigFilePath :: String -> IO FilePath
+getDefaultConfigFilePath "" = do
+ dir <- getConfigDir
+ pure $ joinPath [dir, "config.toml"]
+getDefaultConfigFilePath name = do
+ dir <- getConfigDir
+ pure $ joinPath [dir, "config" <> name <> ".toml"]
+
+resolveConfigPath :: Maybe String -> IO FilePath
+resolveConfigPath Nothing = getDefaultConfigFilePath ""
+resolveConfigPath (Just ('@' : name)) = getDefaultConfigFilePath name
+resolveConfigPath (Just path) = pure path
+
+loadConfigFile :: Maybe String -> IO Configuration
+loadConfigFile pathM = do
+ resolveConfigPath pathM >>= (IO.try . Text.readFile) >>= foobar
where
+ foobar :: Either IOError Text.Text -> IO Configuration
+ foobar rawE = case rawE of
+ Left _ -> pure defaultConfiguration
+ Right txt -> parse txt
parse txt = case parseConfig txt of
Left e -> throwIO $ userError $ show e
Right c -> pure c