summaryrefslogtreecommitdiff
path: root/hs/Config.hs
diff options
context:
space:
mode:
Diffstat (limited to 'hs/Config.hs')
-rw-r--r--hs/Config.hs75
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