salak-0.2.2: src/Data/Salak/CommandLine.hs
module Data.Salak.CommandLine where
import Control.Monad.IO.Class
import Control.Monad.State
import Data.Maybe
import Data.Salak.Types
import Data.Text (pack)
import System.Environment
-- | CommandLine parser. Parse command line into property key values.
type ParseCommandLine = [String] -> IO [(String,Property)]
-- | Default command line parsers.
-- Use format:
--
-- > --KEY=VALUE
--
-- For example:
--
-- > --salak.config.name=test.yml => ("salak.config.name", PStr "test.yml")
--
defaultParseCommandLine :: ParseCommandLine
defaultParseCommandLine = return . mapMaybe go
where
go ('-':'-':as) = case break (=='=') as of
(a,'=':b) -> Just (a,PStr $ pack b)
_ -> Nothing
go _ = Nothing
-- | Load `Properties` from 'CommandLine'
makePropertiesFromCommandLine :: ParseCommandLine -> Properties -> IO Properties
makePropertiesFromCommandLine parser p = getArgs >>= (\a -> makePropertiesFromCommandLine' a parser p)
makePropertiesFromCommandLine' :: [String] -> ParseCommandLine -> Properties -> IO Properties
makePropertiesFromCommandLine' args parser p = do
v <- parser args
return $ makeProperties (fmap (\(a,b) -> (pack a,b)) v) p
-- | Load Properties from CommandLine
--
-- @since 0.2.2
loadCommandLine :: MonadIO m => ParseCommandLine -> LoadProperties m ()
loadCommandLine pcl = do
p <- get
q <- liftIO $ makePropertiesFromCommandLine pcl p
put q