vimeta-0.2.0.0: src/Vimeta/UI/CommandLine/Config.hs
{-# LANGUAGE OverloadedStrings #-}
{-
This file is part of the vimeta package. It is subject to the license
terms in the LICENSE file found in the top-level directory of this
distribution and at git://pmade.com/vimeta/LICENSE. No part of the
vimeta package, including this file, may be copied, modified,
propagated, or distributed except according to the terms contained in
the LICENSE file.
-}
--------------------------------------------------------------------------------
module Vimeta.UI.CommandLine.Config
( Options
, optionsParser
, run
) where
--------------------------------------------------------------------------------
import Control.Monad
import Control.Monad.Trans.Either
import Data.Monoid
import Data.Text (Text)
import qualified Data.Text as Text
import Options.Applicative
import System.Console.Byline
import System.Exit
import Vimeta.Core
--------------------------------------------------------------------------------
-- The following is a kludge to avoid the "redundant import" warning
-- when using GHC >= 7.10.x. This should be removed after we decide
-- to stop supporting GHC < 7.10.x.
import Prelude
--------------------------------------------------------------------------------
data Options = Options
{ optsKey :: Maybe Text
, optsTagger :: Tagger
}
--------------------------------------------------------------------------------
optionsParser :: Parser Options
optionsParser = Options <$> optional (Text.pack <$> strOption getKey)
<*> pure AtomicParsley
where
-- Parser options for @optsKey@
getKey = mconcat [ short 'k'
, long "key"
, metavar "KEY"
, help "Set the API key to KEY"
]
--------------------------------------------------------------------------------
run :: Options -> IO ()
run opts = do
let def = defaultConfig (optsTagger opts)
config = case optsKey opts of
Nothing -> def
Just k -> def {configTMDBKey = k}
result <- runEitherT (app opts config)
case result of
Left e -> byline Error e >> exitFailure
Right (Just w) -> byline Warning w
Right Nothing -> return ()
where
byline :: ReportType -> String -> IO ()
byline rt = void . runByline . reportLn rt . text . Text.pack
--------------------------------------------------------------------------------
app :: Options -> Config -> EitherT String IO (Maybe String)
app opts config = do
filename <- writeConfig config
return $ case optsKey opts of
Just _ -> Nothing -- No warnings.
Nothing -> Just (missingKey filename)
where
missingKey = ("please edit the config file and set the API key: " ++)