{-# LANGUAGE NoImplicitPrelude #-}

module System.Etc.Internal.Spec.JSON where

import qualified Data.Text.IO        as Text (readFile)
import           RIO
import qualified RIO.ByteString.Lazy as LBS
import qualified RIO.Text            as Text

import qualified Data.Aeson as JSON

import System.Etc.Internal.Spec.Types

parseConfigSpec :: (MonadThrow m, JSON.FromJSON cmd) => Text -> m (ConfigSpec cmd)
parseConfigSpec input = case JSON.eitherDecode (LBS.fromStrict $ encodeUtf8 input) of
  Left  err    -> throwM $ InvalidConfiguration Nothing (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