module Conferer.Provider.CLIArgs
  (
    -- * Command line arguments Provider
    -- | This provider provides keys from the command line arguments passed into
    -- the program. It only accepts arguments with @--@ and an equals, for
    -- example: @./awesomeapp --warp.port=5000@
    mkCLIArgsProvider
    , mkCLIArgsProvider'
    , parseArgsIntoKeyValue
  )
where

import           Data.Text (Text)
import qualified Data.Text as Text
import           Data.Maybe (mapMaybe)
import           Data.String (fromString)
import           System.Environment (getArgs)

import Conferer.Types
import Conferer.Provider.Simple


-- | Create a 'ProviderCreator' for CLIArgs from a argument list
mkCLIArgsProvider' :: [String] -> ProviderCreator
mkCLIArgsProvider' args = \config -> do
  let configMap = parseArgsIntoKeyValue args
  mkMapProvider configMap config

-- | Same as 'mkCLIArgsProvider'' but using 'getArgs' to provide the argument
-- list
mkCLIArgsProvider :: ProviderCreator
mkCLIArgsProvider = \config -> do
  args <- getArgs
  mkCLIArgsProvider' args config

-- | Parse an argument list into a dictionary suitable for a 'Provider'
parseArgsIntoKeyValue :: [String] -> [(Key, Text)]
parseArgsIntoKeyValue =
  fmap (\(k, s) -> (fromString $ Text.unpack k, s)) .
  fmap (\s -> fmap (Text.drop 1) $ Text.breakOn "=" s).
  mapMaybe (Text.stripPrefix "--") .
  takeWhile (/= "--") .
  fmap Text.pack