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