summaryrefslogtreecommitdiffhomepage
path: root/lib/Language/Haskell/Stylish/Config.hs
diff options
context:
space:
mode:
Diffstat (limited to 'lib/Language/Haskell/Stylish/Config.hs')
-rw-r--r--lib/Language/Haskell/Stylish/Config.hs48
1 files changed, 26 insertions, 22 deletions
diff --git a/lib/Language/Haskell/Stylish/Config.hs b/lib/Language/Haskell/Stylish/Config.hs
index 9fddbb5..19588b7 100644
--- a/lib/Language/Haskell/Stylish/Config.hs
+++ b/lib/Language/Haskell/Stylish/Config.hs
@@ -1,9 +1,10 @@
--------------------------------------------------------------------------------
{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE TemplateHaskell #-}
module Language.Haskell.Stylish.Config
( Extensions
, Config (..)
- , defaultConfigFilePath
+ , defaultConfigBytes
, configFilePath
, loadConfig
) where
@@ -14,12 +15,13 @@ import Control.Monad (forM, mzero)
import Data.Aeson (FromJSON (..))
import qualified Data.Aeson as A
import qualified Data.Aeson.Types as A
-import Data.Maybe (fromMaybe)
import qualified Data.ByteString as B
+import qualified Data.FileEmbed as FileEmbed
import Data.List (inits,
intercalate)
import Data.Map (Map)
import qualified Data.Map as M
+import Data.Maybe (fromMaybe)
import Data.Yaml (decodeEither)
import System.Directory
import System.FilePath (joinPath,
@@ -34,11 +36,11 @@ import Language.Haskell.Stylish.Step
import qualified Language.Haskell.Stylish.Step.Imports as Imports
import qualified Language.Haskell.Stylish.Step.LanguagePragmas as LanguagePragmas
import qualified Language.Haskell.Stylish.Step.SimpleAlign as SimpleAlign
+import qualified Language.Haskell.Stylish.Step.Squash as Squash
import qualified Language.Haskell.Stylish.Step.Tabs as Tabs
import qualified Language.Haskell.Stylish.Step.TrailingWhitespace as TrailingWhitespace
import qualified Language.Haskell.Stylish.Step.UnicodeSyntax as UnicodeSyntax
import Language.Haskell.Stylish.Verbose
-import Paths_stylish_haskell (getDataFileName)
--------------------------------------------------------------------------------
@@ -65,26 +67,22 @@ configFileName = ".stylish-haskell.yaml"
--------------------------------------------------------------------------------
-defaultConfigFilePath :: IO FilePath
-defaultConfigFilePath = getDataFileName "data/stylish-haskell.yaml"
+defaultConfigBytes :: B.ByteString
+defaultConfigBytes = $(FileEmbed.embedFile "data/stylish-haskell.yaml")
--------------------------------------------------------------------------------
-configFilePath :: Verbose -> Maybe FilePath -> IO FilePath
-configFilePath _ (Just userSpecified) = return userSpecified
+configFilePath :: Verbose -> Maybe FilePath -> IO (Maybe FilePath)
+configFilePath _ (Just userSpecified) = return (Just userSpecified)
configFilePath verbose Nothing = do
- current <- getCurrentDirectory
- home <- getHomeDirectory
- def <- defaultConfigFilePath
- mbConfig <- search $
+ current <- getCurrentDirectory
+ configPath <- getXdgDirectory XdgConfig "stylish-haskell"
+ home <- getHomeDirectory
+ mbConfig <- search $
[d </> configFileName | d <- ancestors current] ++
- [home </> configFileName, def]
+ [configPath </> "config.yaml", home </> configFileName]
- case mbConfig of
- Just config -> return config
- Nothing -> fail $
- "Language.Haskell.Stylish.Config.configFilePath: " ++
- "could not load default configuration at: " ++ def
+ return mbConfig
where
-- All ancestors of a dir (including that dir)
ancestors :: FilePath -> [FilePath]
@@ -101,11 +99,11 @@ configFilePath verbose Nothing = do
--------------------------------------------------------------------------------
loadConfig :: Verbose -> Maybe FilePath -> IO Config
-loadConfig verbose mfp = do
- fp <- configFilePath verbose mfp
- verbose $ "Loading configuration at " ++ fp
- bs <- B.readFile fp
- case decodeEither bs of
+loadConfig verbose userSpecified = do
+ mbFp <- configFilePath verbose userSpecified
+ verbose $ "Loading configuration at " ++ fromMaybe "<embedded>" mbFp
+ bytes <- maybe (return defaultConfigBytes) B.readFile mbFp
+ case decodeEither bytes of
Left err -> error $
"Language.Haskell.Stylish.Config.loadConfig: " ++ err
Right config -> return config
@@ -140,6 +138,7 @@ catalog = M.fromList
[ ("imports", parseImports)
, ("language_pragmas", parseLanguagePragmas)
, ("simple_align", parseSimpleAlign)
+ , ("squash", parseSquash)
, ("tabs", parseTabs)
, ("trailing_whitespace", parseTrailingWhitespace)
, ("unicode_syntax", parseUnicodeSyntax)
@@ -178,6 +177,11 @@ parseSimpleAlign c o = SimpleAlign.step
--------------------------------------------------------------------------------
+parseSquash :: Config -> A.Object -> A.Parser Step
+parseSquash _ _ = return Squash.step
+
+
+--------------------------------------------------------------------------------
parseImports :: Config -> A.Object -> A.Parser Step
parseImports config o = Imports.step
<$> pure (configColumns config)