packages feed

confetti-0.3.1: app/Main.hs

{-# LANGUAGE OverloadedStrings #-}

import           Data.Version       (showVersion)
import           Lib
import           Paths_confetti     (version)
import           System.Environment
import           System.Exit
import           Text.Printf

import qualified Data.Text          as T

-- Structure for our command line arguments
data MainArgs = MainArgs
  { groupName     :: String
  , variantPrefix :: ConfigVariantPrefix
  } deriving (Show)

-- Parse our command line arguments for a confetti command,
-- or display some information and exit
parseMainArgs :: [String] -> IO MainArgs
parseMainArgs [g, v] = return (MainArgs g $ Just v)
parseMainArgs a =
  let usage =
        "Usage: `confetti [required group_name] [optional variant_prefix]`"
      showHelp = (putStrLn usage >> exitSuccess)
      confettiVersion =
        putStrLn ("confetti " ++ showVersion version) >> exitSuccess
  in case a of
       ["-h"]        -> showHelp
       ["--help"]    -> showHelp
       ["-v"]        -> confettiVersion
       ["--version"] -> confettiVersion
       [g]           -> return (MainArgs g Nothing)
       _             -> printFail usage >> exitWith (ExitFailure 1)

main :: IO ()
main = do
  args <- getArgs
  parsed <- parseMainArgs args
  printf
    "Setting %s to %s\n"
    (groupName parsed)
    (showPrefix $ variantPrefix parsed)
  specPath <- absolutePath "~/.confetti.yml"
  group <- parseGroup specPath (T.pack $ groupName parsed)
  let validatedGroup = group >>= validateSpec
  either (printFail . show) (runSpec (variantPrefix parsed)) validatedGroup

-- Run our configuration spec. Prints whatever error message we get back,
-- or a success message
runSpec :: ConfigVariantPrefix -> ConfigGroup -> IO ()
runSpec prefix group =
  applySpec (ConfigSpec group prefix) >>= \maybeError ->
    maybe (printSuccess "Success (ノ◕ヮ◕)ノ*:・゚✧") (printFail . show) maybeError