{- |
    Module : Data.Text.Interp

    Main library module
-}
module Data.Text.Interp
  ( opts
  , doInterp
  , Input(..)
  ) where

import Control.Monad.Except
import Control.Monad.Trans (lift)
import Data.Aeson
import Data.Text (Text)
import qualified Data.Text as T
import qualified Data.Text.IO as T
import System.IO (FilePath)
import Text.Megaparsec

import Data.Text.Interp.CLI (Input(..), opts)
import Data.Text.Interp.Interpolate (interp)
import Data.Text.Interp.Parse (itP)
import Data.Text.Interp.Types (I)


-- | Generate interpolated text within a `Data.Text.Interp.Types.I` monad
doInterp :: FilePath -- ^ path to substitutions file
         -> FilePath -- ^ path to interpolations file
         -> I Text   -- ^ resulting interpolated text
doInterp sf tf = do
  i <- parse itP "" <$> T.strip <$> (lift $ T.readFile tf)
  case i of
    (Left e) -> throwError . T.pack $ errorBundlePretty e
    (Right i') -> do
      s <- lift $ eitherDecodeFileStrict sf
      case s of
        (Left e) -> throwError $ T.pack e
        (Right s') -> interp s' i'