{-# LANGUAGE DeriveGeneric  #-}

module Parser
  ( Config(..)
  , RunConfig(..)
  , loadAndParse
  ) where

import           Data.Aeson.Types
import qualified Data.Yaml        as Y
import           Protolude

data Config = Config
  { _dirs :: [Text]
  , _files :: [Text]
  , _ignore :: Maybe [Text]
  , _tasks :: Maybe [Text]
  , _run   :: Maybe [RunConfig]
  } deriving (Eq, Show, Generic)

instance Y.FromJSON Config where
  parseJSON = genericParseJSON defaultOptions {fieldLabelModifier = drop 1}

data RunConfig = RunConfig
  { _workingDir :: Maybe Text
  , _command :: Text
  , _env :: Maybe [(Text,Text)]
  } deriving (Eq, Show, Generic)

instance Y.FromJSON RunConfig where
  parseJSON = genericParseJSON defaultOptions {fieldLabelModifier = drop 1}

loadAndParse :: FilePath -> IO [Config]
loadAndParse filePath = do
  config <- Y.decodeFileEither filePath
  eitherToIo config
  where
    eitherToIo (Left configError) = throwIO configError
    eitherToIo (Right config)     = return config