diff options
Diffstat (limited to 'hs/Config.hs')
-rw-r--r-- | hs/Config.hs | 75 |
1 files changed, 50 insertions, 25 deletions
diff --git a/hs/Config.hs b/hs/Config.hs index 69dedf6..a2ceaeb 100644 --- a/hs/Config.hs +++ b/hs/Config.hs @@ -1,17 +1,20 @@ {-# LANGUAGE TemplateHaskell , OverloadedStrings , FlexibleInstances + , ImportQualifiedPost #-} module Config where import Control.Lens -import Data.Ini.Config import Data.Map (Map) -import Network.URI (URI) +import Data.Map qualified as M +import Network.URI (URI, parseURI) import Options.Applicative -import Data.Ini.Config.URIDict +import Data.Ini +import Data.Maybe (isJust, fromMaybe, fromJust) import Data.String +import Data.Text (Text, unpack) data Args = Args { indir :: Maybe String @@ -30,9 +33,9 @@ argp = Args <*> strOption (long "conf" <> short 'c' <> help "Alternative Configuration" <> metavar "CONF" <> value Nothing) <*> strOption (long "webp" <> help "Prefix for web" <> metavar "PREFIX" <> value Nothing) -opts = info (argp <**> helper) - (fullDesc - <> progDesc "Build Vimwiki" +opts = info (argp <**> helper) + (fullDesc + <> progDesc "Build Vimwiki" <> header "build - build vimwiki") @@ -61,25 +64,47 @@ makeLenses ''Configuration makeLenses ''DataConfig makeLenses ''OutputConfig -confParser :: IniParser Configuration -confParser = do - out <- section "Output" $ do - mu4eURL <- fieldMbOf "mu4eURL" string - xapianOmega <- fieldMbOf "xapianOmega" string - webPath <- fieldDefOf "webpath" string "" - manProvider <- fieldMbOf "manProvider" string - return OutputConfig { _mu4eURL = mu4eURL - , _xapianOmega = xapianOmega - , _manProvider = manProvider - , _webPath = webPath } - data' <- sectionDef "Data" (_data' defaultConf) $ do - inputDir <- fieldOf "inputDir" string - outputDir <- fieldOf "outputDir" string - return DataConfig { _inputDir = inputDir, _outputDir = outputDir } - wikis <- section "Wikis" uriDictParser - return $ Configuration out data' wikis - -runParser = flip parseIniFile $ confParser +-- +-- either to maybe +etm :: Either a b -> Maybe b +etm (Left _) = Nothing +etm (Right a) = Just a + +fromRight (Right x) = x + +parseURIs :: [(Text, String)] -> Map String URI +parseURIs lst = lst & fmap (_2 %~ parseURI) + & filter (isJust . snd) + & fmap (_2 %~ fromJust) + & fmap (_1 %~ unpack) + & M.fromList + +confParser :: Ini -> Configuration +confParser ini = + Configuration + { _output = OutputConfig { _mu4eURL = d "Output" "mu4eURL" + , _xapianOmega = d "Output" "xapianOmega" + , _webPath = fromMaybe "" $ d "Output" "webpath" + , _manProvider = d "Output" "manProvider" + } + , _data' = if "Data" `elem` sections ini + then DataConfig + -- Thi4s will crash if key is missing + { _inputDir = f "Data" "inputDir" + , _outputDir = f "Data" "outputDir" + } + else (_data' defaultConf) + , _wikis = case keys "Wikis" ini of + Left _ -> mempty + -- This is safe + Right keys -> parseURIs $ zip keys $ f "Wikis" <$> keys + } + + where d a b = etm $ unpack <$> lookupValue a b ini + f a b = unpack . fromRight $ lookupValue a b ini + +runParser :: Text -> Either String Configuration +runParser t = confParser <$> parseIni t parseCmdline = execParser opts |