diff options
| author | Akshay Nair <phenax5@gmail.com> | 2025-10-05 18:49:36 +0530 |
|---|---|---|
| committer | Akshay Nair <phenax5@gmail.com> | 2025-10-05 18:49:36 +0530 |
| commit | 577a30cd5894aa16cf81606767d4d07c3e7b1603 (patch) | |
| tree | a3c50dade9399660ddba1008375f833862cf8839 /lib/Daffm/Configuration.hs | |
| parent | 845b96c9a7f6d80f2042ef5d334fd6842d617f27 (diff) | |
| download | daffm-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.hs | 28 |
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 |
