diff options
Diffstat (limited to 'lib/Language/Haskell/Stylish/Config.hs')
-rw-r--r-- | lib/Language/Haskell/Stylish/Config.hs | 48 |
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) |