{-# LANGUAGE NoImplicitPrelude #-}
{-# LANGUAGE OverloadedStrings #-}
module System.Etc.Internal.Spec.JSON where

import Protolude

import Control.Monad.Catch (MonadThrow (..))

import qualified Data.Aeson              as JSON
import qualified Data.Text               as Text
import qualified Data.Text.IO            as Text (readFile)
import qualified Data.Text.Lazy          as Text (fromStrict)
import qualified Data.Text.Lazy.Encoding as Text (encodeUtf8)

import System.Etc.Internal.Spec.Types

parseConfigSpec
  :: (MonadThrow m, JSON.FromJSON cmd)
    => Text
    -> m (ConfigSpec cmd)
parseConfigSpec input =
  case JSON.eitherDecode (Text.encodeUtf8 $ Text.fromStrict input) of
    Left err ->
      throwM $ InvalidConfiguration (Text.pack err)

    Right result ->
      return result

readConfigSpec :: JSON.FromJSON cmd => Text -> IO (ConfigSpec cmd)
readConfigSpec filepath = do
  contents <- Text.readFile (Text.unpack filepath)
  parseConfigSpec contents