Blogdown-0.2.1: src/Options.hs
module Options where
import Data.Either
import Data.List
import qualified Data.Map.Strict as M
import System.Environment (getArgs)
import Parsing.ParseOptions
import Rendering.RenderOptions
isNotFlag :: String -> Bool
isNotFlag s = not $ isPrefixOf "--" s
splitArgsByFlag :: [String] -> [[String]]
splitArgsByFlag [] = []
splitArgsByFlag (flag : args) = (flag : (takeWhile isNotFlag args)) : (splitArgsByFlag $ dropWhile isNotFlag args)
option :: [String] -> Either (ParseOptions -> ParseOptions) (RenderOptions -> RenderOptions)
option (flag: flagArgs) = if M.member flag parseOptions
then Left $ (parseOptions M.! flag) flagArgs
else Right $ (renderOptions M.! flag) flagArgs
options :: [String] -> (ParseOptions, RenderOptions)
options args = (foldl (.) id parseOptionsMods defaultParseOptions,
foldl (.) id renderOptionsMods defaultRenderOptions)
where
eitherMods = map option $ splitArgsByFlag args
(parseOptionsMods, renderOptionsMods) = partitionEithers eitherMods
getOptions :: IO (ParseOptions, RenderOptions)
getOptions = fmap options getArgs